【发布时间】: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