2017-03-06 65 views
0
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

我想它在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); 

这是不工作也由串优先排序仅返回结果。选择案例不适用于条件构建查询。

回答

0

你选择cb.desc(root.get("priority"));原来的“piority”。小心,在你的第一个例子中你使用了asc和second 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);