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



我有一个翻译类,例如:

 class Translation{
      String key;
      String type;
      String userId;
      @OneToMany
      Set<TranslationValue> translations;
 }

它与TranslationValue类保持OneToMany关系,例如:

 class TranslationValue{
      String language;
      String value;
      @ManyToOne
      Translation translation;
 }

我想基于TranslationValue.language成员进行查询,并返回一个Translation对象列表,该列表包含一个只有1个TranslationValue对象的集合->用作查询参数的对象,例如:

translationDao.findAllForLanguage("en");

这将返回数据库中TranslationValue.language="en"的每个翻译对象,此外还将从语言不为"en"时的每个对象中删除translation.translations。

到目前为止,我返回了所有Translation对象的列表,这些对象在各自的翻译集中有一个成员为language="en"的TranslationValue对象。我需要删除所有没有language="en"的TranslationValue对象。

编辑:进度

此查询返回正确的点击量,但所有值都为null。->

 @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}

此查询返回一个Object[],其中第二个对象实际上是我想要的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'}

这个查询应该可以进行良好的

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

最新更新