Порядок выполнения запросов по значению параметра в дочернем объекте

#java #spring-boot #spring-data-jpa #querydsl

#java #весенняя загрузка #spring-data-jpa #querydsl

Вопрос:

У меня есть объект, который является образцом (сильно упрощенным)

 class Sample {
    List analysis;
}
  

И анализ содержит значение

 class Analysis {
    Integer value;
}
  

Образец содержит N таких образцов, и не все из них имеют значения. В Querydsl я хочу упорядочить результаты по проценту анализа, который имеет любое значение.

Я пробовал это, но не похоже, что он подсчитывает количество значений.

 query.orderBy(
    new OrderSpecifier(
        pRequest.getOrder(),
        Expressions.asNumber(qSample.analysis.any().value.isNotNull().count().divide(qSample.analysis.size()) )
    )
);
  

Ответ №1:

Попробуйте:

 query.orderBy(
    pRequest.getOrder(),
    Expressions.asNumber(
         qSample.analysis.any().value.isNotNull().count().divide(qSample.analysis.size())).asc()
);
  

Комментарии:

1. Это дает мне Request processing failed; nested exception is java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: expecting CLOSE, found 'is' near line 5, column 38

2. Похоже, что Hibernate не поддерживает подзапросы, введенные с помощью вызовов any() и size() в предложении order by. Я предлагаю вам переписать их в простые подзапросы.