项目中遇到一个需求,涉及到嵌套查询,使用criteria不方便,便想使用SQLQuery直接写sql查询,但是因为查询结果需要分页,不知道如何解决。最后发现SQLQuery本身带有分页方法。setFirstResult和setMaxResults。
StringBuilder dataQuery = new StringBuilder("");
dataQuery.append("SELECT USERNAME,EMP_NAME,EMP_DUTY_NAME,LISTAGG(ROLE_NAME, ',') WITHIN GROUP(ORDER BY ROLE_NAME),");
dataQuery.append(" DEPT_CODE,DEPT_NAME,PARENT_DEPT_CODE,STATUS FROM (SELECT TU.USERNAME, TE.EMP_NAME, TE.EMP_DUTY_NAME,");
dataQuery.append(" TR.ROLE_NAME, TD.DEPT_CODE,TD.DEPT_NAME,TD.PARENT_DEPT_CODE,TU.STATUS FROM TS_USER TU,TS_USER_ROLE TUR,TS_ROLE TR,TM_DEPARTMENT TD,TM_EMPLOYEE TE");
dataQuery.append(" WHERE TU.USER_ID = TUR.USER_ID AND TU.EMP_ID = TE.EMP_ID AND TUR.ROLE_ID = TR.ROLE_ID AND TU.DEPT_ID = TD.DEPT_ID");
dataQuery.append(conBuilder);
dataQuery.append(" AND 1 = 1 ORDER BY TU.USERNAME ASC) GROUP BY USERNAME,EMP_NAME,EMP_DUTY_NAME,DEPT_CODE,DEPT_NAME,PARENT_DEPT_CODE,STATUS");
SQLQuery query = session.createSQLQuery(dataQuery.toString());
query.setFirstResult(pageSize * pageIndex);
query.setMaxResults(pageSize).list();
return query.list();