【问题标题】:Spring Data JPA + QueryDSL Query optimizationSpring Data JPA + QueryDSL 查询优化
【发布时间】:2014-03-29 01:00:11
【问题描述】:

在使用与 Spring Data JPA 集成的 QueryDSL 时,我遇到了一个奇怪的行为:

我在 Project 和 Person 之间有一个 ManyToOne 关系。如果我通过所有者 ID(外键)获得属于用户的所有项目,一切都会按预期工作:

QProject project = QProject.project;
QPerson owner = project.owner;
List<Project> projects = from(project).leftJoin(owner).fetch()
    .where(owner.id.eq(id)).list(project);

生成的查询:

select
    project0_.id as id1_1_0_,
    person1_.id as id1_0_1_,
    project0_.creation_date as creation2_1_0_,
    project0_.name as name3_1_0_,
    project0_.owner as owner4_1_0_,
    person1_.name as name2_0_1_
from
    project project0_
left outer join
    person person1_
        on project0_.owner=person1_.id
where
    project0_.owner=?

但是,假设我们想通过一个不是外键的字段(例如所有者的姓名)来获取属于某个人的所有项目:

QProject project = QProject.project;
QPerson owner = project.owner; 
List<Project> projects = from(project).leftJoin(owner).fetch()
    .where(owner.name.eq(name)).list(project);

在这些情况下,表 Person 不必要地连接了两次(注意 person1_ 和 person2_):

select
    project0_.id as id1_1_0_,
    person1_.id as id1_0_1_,
    project0_.creation_date as creation2_1_0_,
    project0_.name as name3_1_0_,
    project0_.owner as owner4_1_0_,
    person1_.name as name2_0_1_
from
    project project0_
left outer join
    person person1_
        on project0_.owner=person1_.id cross
join
    person person2_
where
    project0_.owner=person2_.id
    and person2_.name=?

知道为什么会发生这种情况以及如何避免吗?

【问题讨论】:

    标签: spring jpa spring-data-jpa querydsl


    【解决方案1】:

    您需要创建一个别名以确保在 where 部分重复使用第一个连接

    QProject project = QProject.project;
    QPerson owner = new QPerson("owner");
    List<Project> projects = from(project)
        .leftJoin(project.owner, owner).fetch()
        .where(owner.name.eq(name))
        .list(project);
    

    【讨论】:

      猜你喜欢
      • 2018-09-23
      • 1970-01-01
      • 2020-06-16
      • 2016-05-27
      • 2012-11-09
      • 2015-05-11
      • 1970-01-01
      • 2013-05-26
      • 2016-02-17
      相关资源
      最近更新 更多