我有一个实体“ Source”,其中有几个实体“ Metadata”,每个实体都有一个“标签”和一个“值”。 我想按特定元数据的值对源进行排序,其中标签为“格式”。某些来源没有“格式”元数据,但我也想对其进行排序,就好像它们具有值为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));
这很好用,但是子查询被调用了两次,一次用于存在性检查,另一次用于case值:
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
是否只能调用一次子查询?