我有一个翻译类,例如:
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