2017-03-06 17 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で注文するケースを選択

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); 

のようにJPAの言語でそれを望んでいた文字列型と、その文字列持つ次の優先順位

です。選択条件は、条件作成クエリには適用されません。

答えて

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); 
関連する問題