Spring-data-jpa'nın @Query
ek açıklamalarını kullanarak bir JPA sorgusu yapıyorum ve çalışamaz duruma geliyorum. İki sınıflar sınıf (soyulmuş belirleyiciler/alıcılar) yapması gerekenlerJPA kullanmak "or" ifadesinde boştur
public class Article {
@Id
@GeneratedValue
private Integer id;
@OneToMany(cascade = CascadeType.ALL)
@OrderColumn(name = "review_index")
private List<Review> reviews;
}
ve
public class Review {
@Id
@GeneratedValue
@Column(unique = true, nullable = false)
private Integer id;
@Column(name = "review_state")
@Enumerated(EnumType.STRING)
private ReviewState state; // simple enum
}
sahip: Sorgu hiç veya hiçbir inceleme içeren tüm Article
dönmelidir PASSED
numaralı topluluğa sahip koleksiyondaki en yüksek endeksle Review
.
@Query("select distinct article from Article article "
+ "left outer join article.reviews r " // outer join to include articles without review
// be sure to be either unreviewed or passed the review
+ "where (article.reviews is empty or article.reviews[maxindex(article.reviews)].state = 'PASSED'))"
aslında işe yarar: sorun yok inceleme ile Articles
hiç sonucundan hariç tutulması olmasıdır. article.reviews is empty
hiç onurlandırılmamış gibi görünüyor. Bir sidenote: is empty
, or
ifadesinin ikinci kısmı dışarıda kalıyorsa çalışır. Yorumlar çıkarılan
Neden sadece r.state = 'PASSED'. Bu, incelenmeyen veya geçmiş bir incelemeye tabi olmayan tüm makalelere neden olur. –
Çünkü sadece koleksiyondaki en yüksek endeksle yapılan incelemenin önemli olduğu önemlidir. – msparer
Denemeyi deneyebilirsiniz: "nerede r.state = 'PASSED' ve r.id = article.reviews [maxindex (article.reviews)] id" (dürüst olmayacağından emin değil) –