代码之家  ›  专栏  ›  技术社区  ›  João Menighin

获取三级关系时联接获取失败

  •  2
  • João Menighin  · 技术社区  · 6 年前

    我有三个实体: Person , Country CountryTranslation . 与一个有关 国家 国家 有许多 CountryTranslations .

    我要我的查询同时获取 国家 国家翻译 当它得到一个 为了避免多个查询。

    带来 国家 随着 我愿意:

    List<Person> persons = (List<Person>) entityManager
                    .createQuery("SELECT person from Person person " +
                                 "left join fetch person.country")
                    .getResultList()
    

    这很好,我看到在Hibernate上,它获取的很好,没有执行额外的查询来带来 国家 但带来 国家翻译 它仍然执行额外的查询。然后我试着:

    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 回复  |  直到 6 年前
        1
  •  1
  •   Dherik    6 年前

    您可以纠正这个错误,为每个关系提供一个别名。

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

    这是一个框架的“限制”:当您使用链接fetch时,应该为每个关系提供一个别名!

    这种行为也可以解释,因为很难理解这些链接的获取真正意味着什么:框架将获取每个关系还是只获取最后一个关系?更简单的方法是告诉框架你想要什么样的获取关系。