我有三个实体:Person
,Country
和CountryTranslation
。
Person
与一个Country
相关,而Country
有多个CountryTranslations
。
我希望我的查询在提取Country
时同时提取CountryTranslations
和Person
,以避免重复查询。
为了将Country
与Person
一起使用,我这样做:
List<Person> persons = (List<Person>) entityManager
.createQuery("SELECT person from Person person " +
"left join fetch person.country")
.getResultList()
这很好用,我在休眠时看到它很好地获取并且没有执行任何额外的查询来带来Country
,但是带来CountryTranslations
时它仍然执行了额外的查询。然后我尝试了:
List<Person> persons = (List<Person>) entityManager
.createQuery("SELECT person from Person person " +
"left join fetch person.country " +
"left join fetch person.country.translations")
.getResultList()
我得到了错误:
org.hibernate.QueryException: query specified join fetching, but the owner of the fetched association was not present in the select list
进行此提取的正确方法是什么?
预先感谢
答案 0 :(得分:1)
您对此进行了更正,为每个关系都赋予了别名。
SELECT person
FROM person person
LEFT JOIN FETCH person.country country
LEFT JOIN FETCH country.translations
这是框架的“局限性”:使用链接访存时,您应该为每个关系指定别名!
这种行为也可以得到解释,因为将很难理解这些链接获取的真正含义:框架将获取每个关系还是仅获取最后一个关系?告诉框架您想要什么获取关系就更简单了。