Springdata selectCase подзапрос в спецификации дубликата запроса - PullRequest
0 голосов
/ 19 сентября 2019

У меня есть сущность "Источник", у которой есть несколько сущностей "Метаданные", каждая из которых имеет "метку" и "значение".Я хочу отсортировать источники по значению определенных метаданных, которые обозначены как «формат».В некоторых источниках нет метаданных «формата», но я также хочу отсортировать их, как если бы они имели «формат» метаданных со значением 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

Можно ли вызвать подзапрос только один раз?

...