带有 where 子句的内连接 querydsl
inner join querydsl with where clause
假设我有这个 table service_providers,它通过 enterprise_id 列有一个自我引用。
id enterprise_id
102 57
103 57
public class ServiceProvider {
....
@ManyToOne
@JoinColumn(name = "enterprise_id")
private ServiceProvider enterprise;
}
我想做的是让 enterprise_id 得到全部 servive_providers。这在 SQL:
中非常简单
select sp1.id
from service_providers sp1
inner join service_providers sp2 on (sp1.enterprise_id=sp2.id)
where sp2.id=57;
但是当我尝试通过 query-dsl 复制它时,我不知何故遇到了问题。
这是它的样子:
QServiceProvider serviceProvider2 = new QServiceProvider("serviceProvider2");
QServiceProvider serviceProvider3 = new QServiceProvider("serviceProvider3");
query.from(serviceProvider2)
.innerJoin(serviceProvider3)
.on(serviceProvider2.enterprise.id.eq(serviceProvider3.id))
.where(serviceProvider3.id.eq(enterpriseId))
.list(serviceProvider2.id);
这是休眠生成的:
select sp1.id
from service_providers sp0
cross join service_providers sp1
inner join service_providers sp2 on (sp1.enterprise_id=sp2.id)
where sp0.id=? and sp2.id=?
除了错误之外,这有点令人困惑。
谁能告诉我我做错了什么?
试试这个:
query.from(serviceProvider2)
.innerJoin(serviceProvider3)
.on(serviceProvider2.enterprise.id.eq(serviceProvider3.id))
.where(serviceProvider3.enterprise_id.eq(enterpriseId))
.list(serviceProvider2.id);
您正在按 ID 而不是 enterprise_id 执行 where。
.where(serviceProvider3.id.eq(enterpriseId))
基本上,在 querydsl 论坛的人的帮助下,这里是重要的部分:纯 JPA 方法是在连接中使用 "association path",我使用的是"root entity" JPA 2.1 规范不允许
正确的查询将如下所示:
query.from(serviceProvider2)
.innerJoin(serviceProvider2.enterprise, serviceProvider3)
.where(serviceProvider3.id.eq(enterpriseId))
.list(serviceProvider2.id);
假设我有这个 table service_providers,它通过 enterprise_id 列有一个自我引用。
id enterprise_id
102 57
103 57
public class ServiceProvider {
....
@ManyToOne
@JoinColumn(name = "enterprise_id")
private ServiceProvider enterprise;
}
我想做的是让 enterprise_id 得到全部 servive_providers。这在 SQL:
中非常简单 select sp1.id
from service_providers sp1
inner join service_providers sp2 on (sp1.enterprise_id=sp2.id)
where sp2.id=57;
但是当我尝试通过 query-dsl 复制它时,我不知何故遇到了问题。
这是它的样子:
QServiceProvider serviceProvider2 = new QServiceProvider("serviceProvider2");
QServiceProvider serviceProvider3 = new QServiceProvider("serviceProvider3");
query.from(serviceProvider2)
.innerJoin(serviceProvider3)
.on(serviceProvider2.enterprise.id.eq(serviceProvider3.id))
.where(serviceProvider3.id.eq(enterpriseId))
.list(serviceProvider2.id);
这是休眠生成的:
select sp1.id
from service_providers sp0
cross join service_providers sp1
inner join service_providers sp2 on (sp1.enterprise_id=sp2.id)
where sp0.id=? and sp2.id=?
除了错误之外,这有点令人困惑。
谁能告诉我我做错了什么?
试试这个:
query.from(serviceProvider2)
.innerJoin(serviceProvider3)
.on(serviceProvider2.enterprise.id.eq(serviceProvider3.id))
.where(serviceProvider3.enterprise_id.eq(enterpriseId))
.list(serviceProvider2.id);
您正在按 ID 而不是 enterprise_id 执行 where。
.where(serviceProvider3.id.eq(enterpriseId))
基本上,在 querydsl 论坛的人的帮助下,这里是重要的部分:纯 JPA 方法是在连接中使用 "association path",我使用的是"root entity" JPA 2.1 规范不允许
正确的查询将如下所示:
query.from(serviceProvider2)
.innerJoin(serviceProvider2.enterprise, serviceProvider3)
.where(serviceProvider3.id.eq(enterpriseId))
.list(serviceProvider2.id);