首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将orderBy排序添加到搜索规范中

将orderBy排序添加到搜索规范中
EN

Stack Overflow用户
提问于 2021-03-13 16:06:13
回答 2查看 281关注 0票数 1

我想通过通过params增加订单来扩展这个规范。

搜索选项DTO:

代码语言:javascript
复制
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);
    }

我试过这个:

代码语言:javascript
复制
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);
    }

我无法找到如何实现这一目标的解决方案。如果我错了,你能给我建议吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-03-19 17:55:01

在调用pageable方法之前重新创建findAll对象:

代码语言:javascript
复制
// 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));
票数 1
EN

Stack Overflow用户

发布于 2021-03-13 16:35:43

您是在问如何使用sortBy列表指定排序顺序吗?下列措施应能发挥作用:

代码语言:javascript
复制
query.orderBy(sortyBy.stream()
    .map(root::get)
    .map(cb::desc)
    .toList());

您还可以通过Pageable查询param (例如,sort=name,asc&sort=type,desc&sort=listaQuoteIng.perc_ing,desc)将排序顺序传递给sort,并很容易地将其调整为标准API,参见this answer

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66615644

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档