加入访存无法获取第三级关系

时间:2019-01-23 13:19:14

标签: java hibernate jpa hql jpql

我有三个实体:PersonCountryCountryTranslationPerson与一个Country相关,而Country有多个CountryTranslations

我希望我的查询在提取Country时同时提取CountryTranslationsPerson,以避免重复查询。

为了将CountryPerson一起使用,我这样做:

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 

进行此提取的正确方法是什么?

预先感谢

1 个答案:

答案 0 :(得分:1)

您对此进行了更正,为每个关系都赋予了别名。

SELECT person 
FROM  person person 
LEFT JOIN FETCH person.country country 
LEFT JOIN FETCH country.translations

这是框架的“局限性”:使用链接访存时,您应该为每个关系指定别名!

这种行为也可以得到解释,因为将很难理解这些链接获取的真正含义:框架将获取每个关系还是仅获取最后一个关系?告诉框架您想要什么获取关系就更简单了。