2017-03-06 67 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);