Specifications Spring数据规范:关系中的notEquals()

Specifications Spring数据规范:关系中的notEquals(),specifications,jpa-criteria,Specifications,Jpa Criteria,我有几个实体: 翻译单位 TranslationValue 地点 TranslationUnit与TranslationValue有许多关系。 TranslationValue的区域设置为1-1。 区域设置具有有意义的字段-jhi_值 我需要做的是:选择那些TranslationUnits,即: 1) 没有相关的TranslationValue(这意味着-根本没有翻译) 2) 没有具有特定区域设置的TranslationValue(例如,“en”) 我已经为此构建了SQL查询,在我的Postgr

我有几个实体:

翻译单位
TranslationValue
地点

TranslationUnit与TranslationValue有许多关系。
TranslationValue的区域设置为1-1。
区域设置具有有意义的字段-jhi_值
我需要做的是:选择那些TranslationUnits,即:

1) 没有相关的TranslationValue(这意味着-根本没有翻译) 2) 没有具有特定区域设置的TranslationValue(例如,“en”)

我已经为此构建了SQL查询,在我的Postgres DB中可以完美运行:

select * from translation_unit tu where  not exists ( select null from translation_value tv join locale l on tv.locale_id =l.id  where l.jhi_value='en'  and tu.id=tv.translation_unit_id);
我需要为此建立规范(它将与其他现有规范相结合)

感谢您的帮助。

找到了解决方案:

Subquery<TranslationValue> subquery = q.subquery(TranslationValue.class);
                Root<TranslationValue> from = subquery.from(TranslationValue.class);
                subquery.distinct(true).
                    select(from).where(cb.and(
                    cb.equal(from.get(TranslationValue_.LOCALE).get(Locale_.VALUE), filterRequest.getLanguageCode())),
                    cb.equal(r.get(TranslationUnit_.ID), from.get(TranslationValue_.TRANSLATION_UNIT))
Subquery Subquery=q.Subquery(TranslationValue.class);
Root-from=subquery.from(TranslationValue.class);
subquery.distinct(true)。
选择(从)。其中(cb和(
cb.equal(from.get(TranslationValue\uu0.LOCALE).get(LOCALE\u0.VALUE),filterRequest.getLanguageCode()),
cb.equal(r.get(TranslationUnit_uu.ID),from.get(TranslationValue_u.TRANSLATION_u.UNIT))