内部连接和组通过使用Spring Data JPA中的规范

时间:2016-05-21 08:08:12

标签: spring spring-data spring-data-jpa criteria querydsl

我正在尝试获取员工详细信息,其中的empltype是职员,其加入日期是最近的。

在SQL Server 2008中查询的结果如下:

class2

我使用SpringData JPA作为我的持久层,使用QuerylDSL,Specification和Predicate来获取数据。

我试图在QueryDSL或Specification中转换上述查询,但无法正确挂钩它们。

员工实体:

select 
 * 
from 
  employee jj 
  inner join
  (
    select 
      max(join_date) as jdate,
      empltype as emptype 
    from 
      employee 
    where 
      empltype='clerk' 
    group by empltype
  ) mm 
    on jj.join_date=mm.jdate and jj.empltype=mm.emptype;

规范类中的谓词方法:

int seqid;(sequence id)
String empltype:
Date joindate;
String role;

应该在// ** //中编写哪些代码来将SQL查询转换为JPA谓词。返回Page的@ Query,NamedQuery或QueryDSL之类的任何其他Spring Data JPA也适用于我。

提前致谢

1 个答案:

答案 0 :(得分:1)

我在记事本中写了这个并且它没有经过测试,但我认为你正在寻找像

这样的东西
QEmployee e1 = new QEmployee("e1");
QEmployee e2 = new QEmployee("e2");

PathBuilder<Object[]> eAlias = new PathBuilder<Object[]>(Object[].class, "eAlias");
JPASubQuery subQuery = JPASubQuery().from(e2)
                                    .groupBy(e2.empltype)
                                    .where(e2.empltype.eq('clerk'))
                                    .list(e2.join_date.max().as("jdate"), e2.emptype)

jpaQuery.from(e1)
        .innerJoin(subQuery, eAlias)
        .on(e1.join_date.eq(eAlias.get("jdate")), e1.emptype.eq(eAlias.get("emptype")))
        .list(qEmployee);