【问题标题】:select case with order by in jpa在 jpa 中选择带有 order by 的案例
【发布时间】:2017-03-06 18:39:52
【问题描述】:
SELECT * FROM orderTable order by 
CASE priority when 'CRITICAL' THEN 1 
   when 'HIGH' then 2 
   when 'MEDIUM' then 3 
   when 'LOW' then 4 
   when 'NOT_ASSIGNED' then 5 
end ASC ,
CreatedAt ASC;

这是我的 mysql 查询及其工作。数据库列priority是字符串类型,该字符串具有以下优先级

我想要像 jpa 这样的语言

CriteriaBuilder cb = em.getCriteriaBuilder();       
CriteriaQuery<T> cq = cb.createQuery(entityClass);
Root<T> root = cq.from(entityClass);
cb.selectCase().when(cb.equal(root.get("priority"), "CRITICAL"), 1)
    .when(cb.equal(root.get("priority"), "HIGH"), 2)
    .when(cb.equal(root.get("priority"), "MEDIUM"), 3)
    .when(cb.equal(root.get("priority"), "LOW"), 4)
    .when(cb.equal(root.get("priority"), "NOT_ASSIGNED"), 5).;
Order temp2 = cb.desc(root.get("priority"));
cq = cq.orderBy(temp2);

这是行不通的,它返回结果仅按字符串优先级排序。选择案例不适用于标准构建查询。

【问题讨论】:

    标签: java mysql hibernate jpa


    【解决方案1】:

    您使用cb.desc(root.get("priority")); 行选择原始“优先权”。小心,在您的第一个示例中,您使用 asc 和第二个 desc。我还添加了默认情况。

        CriteriaBuilder cb = entityManager.getCriteriaBuilder();
        CriteriaQuery<TableTest> cq = cb.createQuery(TableTest.class);
        Root<TableTest> root = cq.from(TableTest.class);
        Expression<Object> caseExpression = cb.selectCase()
                .when(cb.equal(root.get("priority"), cb.literal("CRITICAL")), 1)
                .when(cb.equal(root.get("priority"), cb.literal("HIGH")), 2)
                .when(cb.equal(root.get("priority"), cb.literal("MEDIUM")), 3)
                .when(cb.equal(root.get("priority"), cb.literal("LOW")), 4)
                .when(cb.equal(root.get("priority"), cb.literal("NOT_ASSIGNED")), 5)
                .otherwise(6);
        Order temp2 = cb.desc(caseExpression);
        cq = cq.orderBy(temp2);
    

    【讨论】:

    • 我可以循环这个when语句吗?
    【解决方案2】:

    我们也可以使用javax.persistence.criteria.CriteriaBuilder.SimpleCase

    // ArrayList<T> order - Define Custom order ArrayList // {"HIGH", "MEDIUM", "LOW", "NOT_ASSIGNED"}
    CriteriaBuilder cb = entityManager.getCriteriaBuilder();
    CriteriaQuery<TableTest> query = cb.createQuery(TableTest.class);
    Root<TableTest> root = query.from(TableTest.class);
    query.select(root);
    Path<String> priority = root.get("priority");
    SimpleCase<String, Integer> orderCase = builder.selectCase(priority);
    int i;
    for (i = 0; i < order.size(); i++) {
        orderCase = orderCase.when(order.get(i),i); // .when("HIGH", 0);
    }
    query.orderBy(cb.asc(orderCase.otherwise(i)));
    entityManager.createQuery(query);
    

    我们可以使用CriteriaBuilder.SimpleCase,而不是使用cb.selectCase().when(#)。因为我们可以很容易地循环它。

    • 如果我们有大量订单。
    • 根据用户偏好订购请求。

    【讨论】:

      猜你喜欢
      • 2015-12-10
      • 2016-10-31
      • 1970-01-01
      • 2020-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多