添加 orderBy sorting into search Specification
Add orderBy sorting into search Specification
我想通过按参数添加顺序来扩展此规范。
搜索选项 DTO:
public class ProductSearchParams {
private String title;
private String type;
private LocalDateTime publishedAt;
private String sort;
private List<String> sortBy;
}
public Page<ProductFullDTO> findProducts(ProductSearchParams params, Pageable pageable) {
Specification<Product> spec = (root, query, cb) -> {
List<Predicate> predicates = new ArrayList<>();
if (params.getTitle() != null) {
predicates.add(cb.equal(root.get("title"), params.getTitle()));
}
if (params.getType() != null) {
predicates.add(cb.equal(root.get("type"), params.getType()));
}
if (params.getPublishedAt() != null) {
predicates.add(cb.greaterThan(root.get("publishedAt"), params.getPublishedAt()));
}
return cb.and(predicates.toArray(new Predicate[predicates.size()]));
};
return productService.findAll(spec, pageable).map(productMapper::toFullDTO);
}
我试过这个:
public Page<ProductFullDTO> findProducts(ProductSearchParams params, Pageable pageable) {
Specification<Product> spec = (root, query, cb) -> {
List<Predicate> predicates = new ArrayList<>();
if (params.getTitle() != null) {
predicates.add(cb.equal(root.get("title"), params.getTitle()));
}
if (params.getType() != null) {
predicates.add(cb.equal(root.get("type"), params.getType()));
}
if (params.getPublishedAt() != null) {
predicates.add(cb.greaterThan(root.get("publishedAt"), params.getPublishedAt()));
}
if (params.getPublishedAt() != null) {
predicates.add(cb.greaterThan(root.get("publishedAt"), params.getPublishedAt()));
}
query.orderBy(builder.desc((root.join(Prodotto_.listaQuoteIng))
.get(QuotaIngrediente_.perc_ing)));
return cb.and(predicates.toArray(new Predicate[predicates.size()]));
};
return productService.findAll(spec, pageable).map(productMapper::toFullDTO);
}
我找不到如何实现它的解决方案。你能给我一些错误的建议吗?
你是问如何使用sortBy
列表指定排序顺序?以下应该有效:
query.orderBy(sortyBy.stream()
.map(root::get)
.map(cb::desc)
.toList());
您还可以通过 sort
查询参数(例如 sort=name,asc&sort=type,desc&sort=listaQuoteIng.perc_ing,desc
)将排序顺序传递给 Pageable
,并轻松使其适应条件 API,请参阅 this answer.
在调用 findAll
方法之前重新创建 pageable
对象:
// sort = "desc" sortBy = ["listaQuoteIng.perc_ing"]
List<Sort.Order> orders = params.getSortBy().stream().map(s -> new Sort.Order("asc".equals(params.getSort()) ? ASC : DESC, s)).collect(Collectors.toList());
pageable = new PageRequest(pageable.getPageNumber(), pageable.getPageSize(), new Sort(orders));
我想通过按参数添加顺序来扩展此规范。
搜索选项 DTO:
public class ProductSearchParams {
private String title;
private String type;
private LocalDateTime publishedAt;
private String sort;
private List<String> sortBy;
}
public Page<ProductFullDTO> findProducts(ProductSearchParams params, Pageable pageable) {
Specification<Product> spec = (root, query, cb) -> {
List<Predicate> predicates = new ArrayList<>();
if (params.getTitle() != null) {
predicates.add(cb.equal(root.get("title"), params.getTitle()));
}
if (params.getType() != null) {
predicates.add(cb.equal(root.get("type"), params.getType()));
}
if (params.getPublishedAt() != null) {
predicates.add(cb.greaterThan(root.get("publishedAt"), params.getPublishedAt()));
}
return cb.and(predicates.toArray(new Predicate[predicates.size()]));
};
return productService.findAll(spec, pageable).map(productMapper::toFullDTO);
}
我试过这个:
public Page<ProductFullDTO> findProducts(ProductSearchParams params, Pageable pageable) {
Specification<Product> spec = (root, query, cb) -> {
List<Predicate> predicates = new ArrayList<>();
if (params.getTitle() != null) {
predicates.add(cb.equal(root.get("title"), params.getTitle()));
}
if (params.getType() != null) {
predicates.add(cb.equal(root.get("type"), params.getType()));
}
if (params.getPublishedAt() != null) {
predicates.add(cb.greaterThan(root.get("publishedAt"), params.getPublishedAt()));
}
if (params.getPublishedAt() != null) {
predicates.add(cb.greaterThan(root.get("publishedAt"), params.getPublishedAt()));
}
query.orderBy(builder.desc((root.join(Prodotto_.listaQuoteIng))
.get(QuotaIngrediente_.perc_ing)));
return cb.and(predicates.toArray(new Predicate[predicates.size()]));
};
return productService.findAll(spec, pageable).map(productMapper::toFullDTO);
}
我找不到如何实现它的解决方案。你能给我一些错误的建议吗?
你是问如何使用sortBy
列表指定排序顺序?以下应该有效:
query.orderBy(sortyBy.stream()
.map(root::get)
.map(cb::desc)
.toList());
您还可以通过 sort
查询参数(例如 sort=name,asc&sort=type,desc&sort=listaQuoteIng.perc_ing,desc
)将排序顺序传递给 Pageable
,并轻松使其适应条件 API,请参阅 this answer.
在调用 findAll
方法之前重新创建 pageable
对象:
// sort = "desc" sortBy = ["listaQuoteIng.perc_ing"]
List<Sort.Order> orders = params.getSortBy().stream().map(s -> new Sort.Order("asc".equals(params.getSort()) ? ASC : DESC, s)).collect(Collectors.toList());
pageable = new PageRequest(pageable.getPageNumber(), pageable.getPageSize(), new Sort(orders));