【问题标题】:JPQL inner join and left joinJPQL 内连接和左连接
【发布时间】:2015-03-04 03:58:36
【问题描述】:

我知道什么是联接以及如何在普通 SQL 中使用它们,但我找不到任何关于 Internet 的解释来查询具有关系的对象。我使用 entity,getList.size() 来查询与我的实体有 oneToMany 或 ManyToMany 关联的对象。我想知道有什么方法可以查询对象与他的所有关系。

public Person
@OneToMany
List<Cat>
@ManyToMany
List<DormRoom>

获取所有对象的方法是;

Person p=PersonDAO.getWithId(1L);
p.getCats.size();
p.getsDormRooms.size();

现在我想知道使用 JPQL、CriteriaBuilder 以及可能使用 QueryDSL 获得完全评估的对象。

【问题讨论】:

    标签: jpa join jpql querydsl


    【解决方案1】:

    这叫做 fetch join:

    select distinct p from Person p left join fetch p.cats left join fetch p.dormRooms
    where p.id = :id
    

    请注意:

    • 至少在 Hibernate 中,只有在最多 1 个集合是袋子(即没有任何指定顺序列的列表)时才有效。
    • 这将创建一个返回cats * dormRooms 的笛卡尔积的查询。因此,如果一个人有 100 只猫和 100 个 dormRooms,则将检索 10,000 行。

    【讨论】:

    • 所以基本上,我需要多次查询才能获得完整的对象。我打算用 10.000 行来做什么。
    • 不,上面编辑的查询将返回一个 Person 实体,其中包含所有 100 个宿舍和 100 只猫。但是由于 SQL 的工作方式,Hibernate 将执行的底层 SQL 查询将返回 10000 行。
    • 并且随着关系的增加,具有多个连接的查询会导致越来越多的性能开销。对于这些情况,还有其他最佳解决方案吗?
    • 我想说,如果你需要加载一堆 toMany 关联,那么你可能遇到了 UX 设计问题。在单个页面上显示一个人及其所有朋友、宿舍、猫、电话号码、爱好等是非常罕见的。但如果真的需要,那么你所拥有的就可以了。它会导致每个关联执行一个查询,这还不错。
    猜你喜欢
    • 2015-07-18
    • 2016-01-22
    • 1970-01-01
    • 2017-08-15
    • 2018-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多