aşağıdaki iki tablo düşünün:JPA Ölçüt API'sinde bir alt sorguda bir ORDER BY kullanılmasının alternatifleri nelerdir?
Project (id, project_name)
Status (id, id_project, status_name)
Status
bir
Project
olmuştur ettiği bütün durumları içerir
.
En son durumun "yeni" olduğu tüm projeleri sorgulamak istediğimizi bildirelim. Ben ile gelip SQL sorgusu: Ben Kriterler API kullanarak yukarıdaki sorgu çoğaltmak için çalışıyorum ve sınıf CriteriaQuery yöntemi orderBy
var ama sınıf Subquery değil fark
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)
.
Ben şimdiye kadar gelmelisin olan kriterler Sorgu: Subquery sq
sonuçlarını sıralama ve sadece en son olanı döndürerek için herhangi bir yöntem olmadığı için burada saplanıp
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))
.
Alt sorgusu sıralamak için, yukarıda açıklanan senaryoda istenen sonucu elde etmek için alternatifler nelerdir?
Dize tabanlı JPQL izin vermez: bir ilintisiz forma toplama işlevleri alt sorgu, bu yüzden bir ilintisiz alt sorgunun yazma açıkça epeyce (örnek JPQL kullanır altında, Ölçüt API eşdeğer basit olmalı) iyi olduğunu düşünüyorum Bir alt sorguda SİPARİŞ BY, ve Kriterler bunu basitçe yansıtır. "subquery :: = simple_select_clause subquery_from_clause [nerede_clause] [groupby_clause] [sahip_clause]" –
@NeilStockton Anladım ki, bu yüzden "sq.id" en yüksek değerini döndürmek için alternatif çözümler –
soruyorum. alt sorgu (nerede yan tümce)? "SELECT MAX (sq.id) FROM durum sq WHERE q.id_project = sq.id_project" alt sorgusunu yapamaz mısın? –