Java HQL内部联接查询排除多个集合成员中的对象

Java HQL内部联接查询排除多个集合成员中的对象,java,hibernate,hql,Java,Hibernate,Hql,我有一门翻译课,例如: class Translation{ String key; String type; String userId; @OneToMany Set<TranslationValue> translations; } class TranslationValue{ String language; String value; @ManyToOne

我有一门翻译课,例如:

 class Translation{
      String key;
      String type;
      String userId;
      @OneToMany
      Set<TranslationValue> translations;
 }
 class TranslationValue{
      String language;
      String value;
      @ManyToOne
      Translation translation;
 }
我想基于TranslationValue.language成员进行查询,并返回一个翻译对象列表,其中包含一个仅包含1个TranslationValue对象的集合->用作查询参数的对象,例如:

translationDao.findAllForLanguage("en");
这将返回数据库中具有TranslationValue.language=“en”的每个translation对象,并且将从每个对象translation.translations中删除语言不是“en”的对象

到目前为止,我正在返回一个列表,其中列出了在各自的翻译集中有一个包含language=“en”成员的TranslationValue对象的所有翻译对象。但我需要删除所有没有language=“en”的TranslationValue对象

编辑:进度

此查询返回正确的命中数,但所有值均为空。->

 @Override
public List<Translation> findAllForLanguage2(String language) {
    //TODO:finish
    final Query query = entityManager.createQuery(
            "select new " + getDomain().getSimpleName() + "(t.key,t.clientName,t.userId,t.type,t.platform,tv) from " + getDomain().getSimpleName() + " t right join t.translations tv where tv = some(from tv where tv.language = :language)");
    query.setParameter("language", language);


    return query.getResultList();
}

printing all from query
translation: Translation{key='null', clientName='null', userId='null', type=null, platform='null', translations=null}
translation: Translation{key='null', clientName='null', userId='null', type=null, platform='null', translations=null}
translation: Translation{key='null', clientName='null', userId='null', type=null, platform='null', translations=null}
translation: Translation{key='null', clientName='null', userId='null', type=null, platform='null', translations=null}
translation: Translation{key='null', clientName='null', userId='null', type=null, platform='null', translations=null}
translation: Translation{key='null', clientName='null', userId='null', type=null, platform='null', translations=null}
@覆盖
公共列表findAllForLanguage2(字符串语言){
//TODO:完成
最终查询查询=entityManager.createQuery(
从“+getDomain().getSimpleName()+”中选择新“+getDomain().getSimpleName()+”(t.key,t.clientName,t.userId,t.type,t.platform,tv)从“+getDomain().getSimpleName()+”中右键连接t.tv,其中tv=some(从tv中选择tv.language=:language)”;
query.setParameter(“语言”,语言);
返回query.getResultList();
}
从查询打印全部内容
翻译:翻译{key='null',clientName='null',userId='null',type=null,platform='null',translations=null}
翻译:翻译{key='null',clientName='null',userId='null',type=null,platform='null',translations=null}
翻译:翻译{key='null',clientName='null',userId='null',type=null,platform='null',translations=null}
翻译:翻译{key='null',clientName='null',userId='null',type=null,platform='null',translations=null}
翻译:翻译{key='null',clientName='null',userId='null',type=null,platform='null',translations=null}
翻译:翻译{key='null',clientName='null',userId='null',type=null,platform='null',translations=null}
此查询返回一个对象[],其中第二个对象实际上是我想要的TranslationValue对象,但Translation对象为null->

    @Override
public List<Object> findAllForLanguage(String language) {
    //TODO:finish
    final Query query = entityManager.createQuery(
            "from " + getDomain().getSimpleName() + " t full join t.translations tv where tv = some(from tv where tv.language = :language))");
    query.setParameter("language", language);


    return query.getResultList();
}

printing all from query
null
TranslationValue{language='en', value='feed'}
null
TranslationValue{language='en', value='feed'}
null
TranslationValue{language='en', value='broken'}
null
TranslationValue{language='en', value='broken'}
null
TranslationValue{language='en', value='water'}
null
TranslationValue{language='en', value='broken'}
@覆盖
公共列表findAllForLanguage(字符串语言){
//TODO:完成
最终查询查询=entityManager.createQuery(
“from”+getDomain().getSimpleName()+“t完全加入t.tv,其中tv=some(from tv,其中tv.language=:language))”;
query.setParameter(“语言”,语言);
返回query.getResultList();
}
从查询打印全部内容
无效的
TranslationValue{language='en',value='feed'}
无效的
TranslationValue{language='en',value='feed'}
无效的
TranslationValue{language='en',value='break'}
无效的
TranslationValue{language='en',value='break'}
无效的
TranslationValue{language='en',value='water'}
无效的
TranslationValue{language='en',value='break'}

这个查询应该可以

select t from Translation t join t.translations tv 
where tv.language = :language 
and size(t.translations) = 1

这是否只返回翻译集大小为1的翻译对象?因为那不是我需要的。我想使用我的输入变量来减少集合中对象的数量。那么,您想从数据库中删除行吗?select查询无法做到这一点。Hibernate加载的翻译值集将始终包含翻译的所有翻译值。我不想从数据库中删除行。TranslationValue实际上就是我要查询的值。我不想从数据库中删除行。TranslationValue实际上就是我要查询的值。集合中的每个translationValue对象都包含特定语言的值。我想问“只给我这个键的英文翻译”,在这个问题上,我会得到一个translationValue集大小为1的translation对象->只有translationValue who的语言变量包含“en”。但我也希望能够像“给我这个键的所有翻译”,这将给我返回相同的翻译对象,但有一个更大的TranslationValue对象集。顺便说一句,谢谢你的回答!