2017-04-15 1 views
0

Est-il possible dans QueryDSL de commander par taille de collections avec des paramètres supplémentaires?
Par exemple, quand je l'ordre juste par la taille de la collection OrderSpecifier<Integer> severity = alarmSet.alarms.size().desc(); il produit suivant SQL:requête dsl ordre par collection taille avec param

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

Mais je le veux ajouter condition WHERE AND alarms.AL_STATUS = 1 et produire suivant:

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 

Répondre

0

On dirait qu'il est impossible pour faire ce genre de travail dans QueryDsl (si possible s'il vous plaît fournir une solution!). Mais j'ai trouvé une autre façon d'ajouter une colonne personnalisée avec le nombre d'alarmes et d'ordre par cette colonne.

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

Après cette commande par colonne personnalisée:

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

Et en utilisant Tuple pour sélectionner les données:

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