2017-04-15 23 views
0

QueryDSL中是否有可能通過具有附加參數的集合大小進行排序?
例如,當我剛剛集合的大小OrderSpecifier<Integer> severity = alarmSet.alarms.size().desc();爲了它產生下一個SQL:查詢dsl按參數大小與參數排序

ORDER BY (SELECT 
     COUNT(alarms.AL_ALARM_SET_ID) 
    FROM 
     ALARM alarms 
    WHERE 
     alarmset.ID = alarms.AL_ALARM_SET_ID) DESC 

但我希望它條件添加到WHERE AND alarms.AL_STATUS = 1和未來產生:

ORDER BY (SELECT 
      COUNT(alarms.AL_ALARM_SET_ID) 
     FROM 
      ALARM alarms 
     WHERE 
      alarmsets.ID = alarms.AL_ALARM_SET_ID 
      AND alarms.AL_STATUS = 1) DESC 

回答

0

看起來這是不可能的在QueryDsl中做這種工作(如果可能請提供解決方案!)。 但我發現其他方式 - 添加自定義列與警報的數量,並按此列排序。

//crete subquery to count the size of child collection 
Expression<Long> countExpression = ExpressionUtils.as(JPAExpressions 
        .select(ExpressionUtils.count(alarm)) 
        .from(alarmSet.alarms, alarm) 
        .where(alarm.alStatus.eq(1)), "customCount"); 

通過自定義列的順序之後:

OrderSpecifier<Long> severity = new OrderSpecifier<>(Order.DESC, Expressions.numberPath(Long.class, "customCount")); 

並使用元組來選擇數據:

query.select(Projections.tuple(room, countExpression)).fetch();