【问题标题】:JPA Specification sort by specific value firstJPA 规范首先按特定值排序
【发布时间】:2020-07-07 09:09:35
【问题描述】:

我正在使用 JPA 规范来检索我的 Spring Boot 应用程序的数据。

我有一个如下的 mySQL 查询来获取我想要的列表:

select *
from TableA
order by colB = 'C' DESC, colB;

结果:-

no    | colB
3     |  C
1     |  A
2     |  B
4     |  D

我的问题是,是否可以转换为 JPA 规范?我已经环顾四周,但找不到我想要的。

     Page<Object> page = tableARepository.findAll(
            (Specification<Object>) (root, criteriaQuery, criteriaBuilder) -> {

                List<Predicate> predicates = new ArrayList<>();

                if (sortConfig.getSpecification() != null) {
                    Predicate predicate = sortConfig.getSpecification().toPredicate(root, criteriaQuery, criteriaBuilder);
                    predicates.add(predicate);
                }
                return criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()]));
            },
            sortConfig.getPageable()
    );

【问题讨论】:

  • 按 colB = 'C' 的顺序无效。你想做 where colB = 'C' 还是别的什么?
  • @SimonMartinelli 这是一个合法的查询。参考stackoverflow.com/questions/5417980/…
  • 但就标准而言,它不是一个有效的 SQL 语句。所以你不能把它转换成 JPA 查询
  • @SimonMartinelli 我想我没有说清楚,我使用的是 mySQL 查询。
  • 我知道。我说你不能在 JPA Criteria 中打开你的查询,因为它不是 SQL 标准

标签: spring jpa spring-data-jpa spring-data


【解决方案1】:

这个查询在 JPA 中没有等效项,因为它是特定于供应商的。正如 crizzis 所说,您可以做的是创建一个 ORDER BY CASE 子句。例如:

ORDER BY 
CASE
    -- First condition with higher priority
    WHEN priority = 1 AND situation_id = 2 THEN 1

    -- Second condition with less priority
    WHEN situation_id = 1 THEN 2

    -- Third condition
    WHEN priority = 0 AND situation_id = 2 THEN 3

    -- Fourth condition
    WHEN situation_id = 3 THEN 4
END, 
-- Second ordering column
creation_date DESC

然后用它创建一个 JPQL 查询。

【讨论】:

    【解决方案2】:

    我没有测试过,但你可以试试下面的方法!

    tableARepo.findAllByColBByOrderByColBDesc(col_b_type col_b_parameter)
    

    或许

    tableARepo.findAllByColBByOrderByColBDesc(String colB)
    

    【讨论】:

    • 我试过了,没用
    猜你喜欢
    • 2012-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-03
    • 2014-01-18
    • 1970-01-01
    • 2021-07-02
    相关资源
    最近更新 更多