Consider the following two tables:
Project ( id, project_name)
Status ( id, id_project, status_name)
Where Status
contains all statuses in which a Project
has been.
Lets say we want to query all projects for which the latest status has the name "new". The Sql query that I come up with is:
SELECT q.id_project FROM status q
WHERE q.status_name like 'new'
AND q.id IN (
SELECT TOP 1 sq.id from status sq
WHERE q.id_project = sq.id_project
ORDER BY sq.id DESC )
I'm trying to replicate the above query using Criteria API and I noticed that the class CriteriaQuery has the method orderBy
but the class Subquery doesn't.
The Criteria Query that I have come up with so far is:
CriteriaQuery<Project> q = criteriaBuilder.createQuery(Project.class);
Root<Status> qFrom = q.from(Status.class);
Subquery<Integer> sq = q.subquery(Integer.class);
Root<Status> sqFrom = sq.from(Status.class);
sq.select(sqFrom.get(Status_.id))
.where(criteriaBuilder.equal(sqFrom.get(Status_.project), qFrom.get(Status_.project))
I got stuck here because Subquery sq
doesn't have any method for sorting its results and returning only the latest one.
What are the alternatives to sorting the subquery in order to get the desired result in the scenario described above?