2016-04-12 25 views
1

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

+0

Neden sadece r.state = 'PASSED'. Bu, incelenmeyen veya geçmiş bir incelemeye tabi olmayan tüm makalelere neden olur. –

+0

Çünkü sadece koleksiyondaki en yüksek endeksle yapılan incelemenin önemli olduğu önemlidir. – msparer

+0

Denemeyi deneyebilirsiniz: "nerede r.state = 'PASSED' ve r.id = article.reviews [maxindex (article.reviews)] id" (dürüst olmayacağından emin değil) –

cevap

1

Cevap:

çekirdek sorunu yolu navigasyon "article.reviews" nin katılması (katılmak bırakmamış) örtük ilgiliydi. Bu, bu bölüm için ayrılmış bir alt seçimle atlanabilir.

select distinct article 
from Article article 
left outer join article.reviews r 
where article.reviews is empty or 
    exists(
     select subArticle 
     from Article subArticle 
     where article.id = subArticle.id 
     and subArticle.reviews[maxindex(subArticle.reviews)].state = 'PASSED' 
    )