Как заказать по множественному выбору с помощью Criteria API - PullRequest
0 голосов
/ 09 июля 2020

Я пытаюсь создать общую c абстракцию упорядочивания и фильтрации на моем сервере, но некоторые значения в веб-CRUD могут быть произвольно сложными, поэтому в некоторых случаях мы прибегали к использованию подзапросов. Запрос, который я пытаюсь создать, имеет следующий формат:

SELECT f, (SELECT COUNT(r.id) FROM Bar b WHERE b.foo = e) c
  FROM Foo f
  ORDER BY c

При создании запроса я не могу его воспроизвести. По какой-то причине подзапрос повторяется в предложении WHERE. Это ошибка, которую я получаю:

org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected AST node: query
[select generatedAlias0, (select count(generatedAlias1) from example.Bar as generatedAlias1
  where generatedAlias0=generatedAlias1.foo) from example.Foo as generatedAlias0
  order by (select count(generatedAlias1) from example.Bar as generatedAlias1
    where generatedAlias0=generatedAlias1.foo) asc]

Выдержка из моего кода запроса:

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Tuple> query = cb.createTupleQuery();
Root<T> root = query.from(Foo.class);

Subquery<Long> subquery = query.subquery(Long.class);
Root<?> subqueryRoot = subquery.from(Bar.class);

Expression<Long> count = cb.count(subqueryRoot);
subquery.select(count);
subquery.where(cb.equal(root, subqueryRoot.get("foo")));

query.multiselect(root, subquery.getSelection());
query.orderBy(cb.asc(subquery));
...