3
votes

I am trying to fetch the employee details whose empltype is clerk and whose joining date is the recent one.

For which the query looks like following in SQL Server 2008:

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;

I am using SpringData JPA as my persistence layer using QuerylDSL,Specification and Predicate to fetch the data.

I am trying to convert the above query either in QueryDSL or Specification, but unable to hook them properly.

Employee Entity :

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

Predicate method in Specifcation Class :

Predicate toPredicate(Root<employee> root,CriteriaQuery <?> query,CriteriaBuilder cb)
{
            Predicate pred=null;
            // Returning the rows matching the joining date
            pred=cb.equal(root<Emplyoee_>.get("joindate"));
            //**//

}

What piece of code should be written in //**// to convert about SQL query to JPA predicate. any other Spring Data JPA impl like @Query,NamedQuery or QueryDSL which returns Page also works for me.

Thanks in advance

1
Wouldn't a Employee findTopByEmpltypeOrderByJoindateDesc(String employeeType) suffice?Mubin

1 Answers

2
votes

I wrote this in notepad and it hasn't been tested but I think you're looking for something like

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);