2014-01-31 81 views
0

我需要一些幫助。Sintaxis JQPL篩選器列表

我有這樣的兩個表

public class Publication implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Basic(optional = false) 
    @Column(name = "idPublication") 
    private Integer idPublication; 

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "publication") 
    private List<Question> questionList; 

    .... 
} 

塔布拉問題

public class Question implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Basic(optional = false) 
    @Column(name = "idQuestion") 
    private Integer idQuestion; 

    @Basic(optional = false) 
    @NotNull 
    @Size(min = 1, max = 500) 
    @Column(name = "pregunta") 
    private String question; 

    @JoinColumn(name = "publication", referencedColumnName = "idPublication") 
    @ManyToOne(optional = false) 
    private Publication publication; 

    @NotNull 
    private Boolean activo; 

    .... 
} 

我需要與誰擁有活躍的問題=真正的出版物。 例如:我有出版物A和出版物B,其中A有5個問題,2個有效,B有6個問題,有5個有效。

我嘗試做「選擇從出版物P,問闕p其中p.idPublication = que.publication.idPublication和que.activo = 1」,但它返回與他們的所有問題發表...

我不能FINDE解決這個

請幫助

電賀

回答

0

你不會是能夠做到準確想要的東西,因爲實體從返回JPQL查詢反映數據庫中的內容(或持久性上下文)。換句話說,當你從JPQL查詢中選擇一個實體時,你會得到整個實體 - 你不能過濾它的關係,因爲那樣實體就不會反映數據庫中的內容了。

在你的例子中,你基本上選擇Publication s,它至少有一個活動的Question

要解決您的問題,您可以創建一個MapPublication以激活Question s。類似這樣的:

TypedQuery<Question> query = 
    em.createQuery("select q from Question q where q.activo = true", Question.class); 
List<Question> activeQuestions = query.getResultList(); 

Map<Publication, List<Question>> publicationToActiveQuestions = new HashMap<>(); 
for (Question q : activeQuestions) 
{ 
    List<Question> publicationQuestions = publicationToActiveQuestions.get(q.getPublication()); 
    if (publicationQuestions == null) 
    { 
    publicationQuestions = new ArrayList<>(); 
    publicationToActiveQuestions.put(q.getPublication(), publicationQuestions); 
    } 
    publicationQuestions.add(q); 
}