Рассмотрим следующие две таблицы:Каковы альтернативы использованию ORDER BY в подзапросе в API-интерфейсе JPA?
Project (id, project_name)
Status (id, id_project, status_name)
Где Status
содержит все статусы, в которых Project
было.
Допустим, мы хотим запросить все проекты, для которых последний статус имеет имя «новый». Запрос Sql, что я придумал это:
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)
Я пытаюсь повторить вышеуказанный запрос с использованием Criteria API, и я заметил, что класс CriteriaQuery имеет метод orderBy
но класс Subquery не делает.
критериям запроса, что я придумал до сих пор:
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))
я застрял здесь, потому что Subquery sq
не имеет какой-либо метод для сортировки его результатов и возвращает только последнюю.
Каковы альтернативы сортировке подзапроса, чтобы получить желаемый результат в описанном выше сценарии?
строки на основе JPQL не позволяет ORDER BY в подзапросе, а критерии просто отражают это. "subquery :: = simple_select_clause subquery_from_clause [where_clause] [groupby_clause] [having_clause]" –
@NeilStockton Я понял это, поэтому я прошу об альтернативных решениях –
, чтобы вы хотели вернуть наивысшее значение «sq.id» из подзапрос (с учетом предложения where)? не можете ли вы просто выполнить подзапрос «SELECT MAX (sq.id) FROM status sq WHERE q.id_project = sq.id_project»? –