У меня есть сущность "Источник", у которой есть несколько сущностей "Метаданные", каждая из которых имеет "метку" и "значение".Я хочу отсортировать источники по значению определенных метаданных, которые обозначены как «формат».В некоторых источниках нет метаданных «формата», но я также хочу отсортировать их, как если бы они имели «формат» метаданных со значением null или пустым.
Вот мой код:
Subquery<String> sq = query.subquery(String.class);
Root<Metadata> metas = sq.from(Metadata.class);
Join<Metadata, Source> metaSource = metas.join("source");
Predicate p1 = builder.equal(metas.get("label"), "format");
Predicate p2 = builder.equal(metaSource.get("id"), root.get("id"));
sq.select(metas.get("value")).where(builder.and(p1, p2));
Expression<String> caseValue = builder.<String>selectCase().when(builder.exists(sq), sq).otherwise("");
query.orderBy(builder.asc(caseValeur));
Это работает хорошо, но подзапрос вызывается 2 раза, один для проверки существования и один для значения регистра:
select [...]
from source source0_
order by case when exists (select metadonnee1_.valeur as super from metadonnee metadonnee1_ inner
join source source2_ on metadonnee1_.source_id=source2_.id where metadonnee1_.libelle='Format'
and source2_.id=source0_.id)
then (select metadonnee3_.valeur from metadonnee metadonnee3_ inner join source source4_ on
metadonnee3_.source_id=source4_.id where metadonnee3_.libelle='Format' and
source4_.id=source0_.id)
else '' end asc
Можно ли вызвать подзапрос только один раз?