I am implementing pagination using spring data and for sorting following query i want to prepare inside my specification.
SELECT *
FROM
(
SELECT distinct *
FROM
(
SELECT p.PROJECT_ID,
p.PROJECT_NAME,
p.PROJECT_TYPE
FROM PROJECT p
LEFT OUTER JOIN code c
ON p.codeId=c.ID
WHERE p.PROJECT_NAME IN ('test')
ORDER BY c.LABEL ASC
)
)
WHERE rownum <= 25;
but my specification is creating below script
SELECT *
FROM
(
SELECT distinct p.PROJECT_ID,
p.PROJECT_NAME,
p.PROJECT_TYPE
FROM PROJECT p
LEFT OUTER JOIN code c
ON p.codeId=c.ID
WHERE p.PROJECT_NAME IN ('test')
ORDER BY c.LABEL ASC
)
WHERE rownum <= 25;
Actually i am getting duplicate records after join so i am adding distinct function to fetch distinct records but as for order by clause to work the order by parameter should be present in select statement which is not possible in my case as in my entity it's not present neither i can change that. So i just want to nest my select statement for project statement to another statement and there i want to put distinct as shown in the first script. I am very new to Spring jpa so any help would help.
Here is my specification.
public static Specification<Project> projectListSearchSpec(Set<String> deptNameList, ProjectSearchDto searchDTO) {
return new Specification<Project>() {
@Override
public Predicate toPredicate(Root<Project> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
query.distinct(true);
Predicate all = root.<Project>get("projectName").in(deptNameList);
return all;
}
};
}