在Query DSL和JPA中左连接不相关的表

时间:2014-12-23 11:02:11

标签: java sql jpa querydsl

我有两个不相关的表,每个表都带有字段电子邮件。我需要一个查询,如果电子邮件匹配则引入从第二个表中获取的列,如果没有找到匹配则将为null。在SQL中这很容易:

SELECT tableA.id, tableA.email, tableB.name
 FROM tableA
 LEFT JOIN tableB ON tableA.email=tableB.email
 ORDER BY tableB.name

不幸的是,JPA不允许连接不相关的实体,因此我将其转换为:

SELECT tableA.id, tableA.email,
       (SELECT tableB.name FROM tableB WHERE tableB.email=tableA.email) AS aname
  FROM tableA
  ORDER BY aname 

现在,它作为JPA查询工作,但我们正在使用查询DSL,所以我们去转换它:

JPQLQuery query = new JPAQuery(em);
List<Dto> items=query.from(qTableA)
  .list(new QDto(qTableA.id, qTableA.email,
                 new JPASubQuery().from(qTableB)
                  .where(qTableB.email.eq(qTableA.email)).unique(qTableB.name)))

它有效但现在我不知道如何通过子查询引入的字段实现排序和过滤。

Dto是用于收集结果的POJO,QDto是从Dto自动生成的类。

问题是:如何使用Query DSL和JPA连接两个不相关的表并避免使用本机SQL?可能吗?对tableA和tableB.name中的字段进行排序和过滤是必需的。

1 个答案:

答案 0 :(得分:0)

加入不相关的实体不受最新JPA规范(2.1)

的保护

然而,Hibernate 5.1.0+和EclipseLink 2.4.0+支持ad hoc连接。 http://blog.anthavio.net/2016/03/join-unrelated-entities-in-jpa.html