内部联接querydsl与where子句

时间:2016-10-20 14:19:21

标签: java sql querydsl

假设我有这个表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);

这是hibernate生成的:

 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=?

除了错误之外,这有点令人困惑。

有谁能告诉我这里我做错了什么?

2 个答案:

答案 0 :(得分:1)

基本上,在querydsl论坛的帮助下,这里有重要的一点:纯JPA的方式是在连接中使用“关联路径”,我使用的是“root实体” JPA 2.1规范不允许

正确的查询将如下所示:

 query.from(serviceProvider2)
            .innerJoin(serviceProvider2.enterprise, serviceProvider3)
            .where(serviceProvider3.id.eq(enterpriseId))
            .list(serviceProvider2.id);

答案 1 :(得分:0)

试试这个:

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(serviceProvider3.id.eq(enterpriseId))