Rozważmy następujące dwie tabele:Jakie są alternatywy dla użycia ORDER BY w Podzapytanie w API JPA Criteria?
Project (id, project_name)
Status (id, id_project, status_name)
Gdzie Status
zawiera wszystkie stany, w których Project
wynikły.
Powiedzmy, że chcemy zapytać o wszystkie projekty, dla których najnowszy status ma nazwę "nowy". Zapytania SQL, które wymyślić to:
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)
Próbuję replikować powyższej kwerendy przy użyciu Criteria API i zauważyłem, że klasa CriteriaQuery ma metodę orderBy
ale klasa Subquery nie.
Query Kryteria że mam wymyślić tak daleko jest:
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))
utknąłem tutaj, ponieważ Subquery sq
nie ma żadnego sposobu sortowania swoje wyniki i powrocie tylko ostatnią jeden.
Jakie są alternatywy dla sortowania podzapytania w celu uzyskania pożądanego rezultatu w opisanym powyżej scenariuszu?
String oparte JPQL nie pozwala ORDER BY w podzapytaniu, a kryteria po prostu odzwierciedlają to. "subquery :: = simple_select_clause subquery_from_clause [where_clause] [groupby_clause] [have_clause]" –
@NeilStockton Zrozumiałem to, dlatego proszę o alternatywne rozwiązania –
, więc chcesz zwrócić najwyższą wartość "sq.id" z podzapytanie (z zastrzeżeniem klauzuli where)? nie możesz po prostu wykonać podkwerendy "SELECT MAX (sq.id) FROM status sq WHERE q.id_project = sq.id_project"? –