2013-06-02 48 views
1

在我們的領域模型,我們有JPQL - 選擇在一個某些元素許多集合

@Entity 
@SequenceGenerator(name = "wordlist_seq", sequenceName = "wordlist_seq") 
public class QuestionSet { 
    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "wordlist_seq") 
    private Long id; 

    @OneToMany(cascade = CascadeType.ALL) 
    private List<Question> questions; 

,我想寫的是獲取那些在questions收集匹配IN至少一個問題的所有QuestionSet實例查詢謂詞,我也想只在questions集合中有匹配的問題。

這裏是我寫的查詢:

SELECT s FROM QuestionSet s JOIN s.questions q WHERE q IN (SELECT ar.question FROM AppointedRepetition ar WHERE ar.date < :tomorrow) 

日期從喬達時庫爲DateTime型的,我把它像這樣:

query.setParameter("tomorrow", DateTime.now().plusDays(1)) 

現在這個工程部分,我只得到匹配得當的那些QuestionSets,但我也得到了所有的問題,即使例如其中只有一個匹配IN

我的期望值是否過高或者有什麼方法可以限制questions列表中的實例數?

回答

6

編號JPA不會返回與數據庫實際不匹配的實體。如果一個QuestionSet在數據庫中有4個問題,QuestionSet實體將有4個問題。

如果您只想要一些問題,請選擇您感興趣的問題,並導航到他們的問題集。

或執行下面的查詢,這將返回匹配的問題集,以及匹配的問題:

SELECT s, q FROM QuestionSet s JOIN s.questions q WHERE ... 
+0

關於你給的查詢,它會返回什麼樣的對象? – Andna

+1

列表,其中每個Object []將包含QuestionSet作爲第一個元素,並將Question作爲第二個元素。 –

+0

謝謝,它可能派上用場。 – Andna

0

更好的答案是更新您的getter函數。

@Entity 
@SequenceGenerator(name = "wordlist_seq", sequenceName = "wordlist_seq") 
public class QuestionSet { 
    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "wordlist_seq") 
    private Long id; 

    @OneToMany(cascade = CascadeType.ALL) 
    private List<Question> questions; 

    public List<Question> getQuestions() { 
    for(Question q: questions) { 
     List<Question> filtered = new ArrayList<Question>(); 
     if(q.date < DateTime.now().plusDays(1)) filtered.add(q); 
    } 
    return filtered; 
    } 
} 

現在您可以調用getQuestions函數,您將獲得過濾器值。您可以添加過濾器局部變量並在getQuestions內部使用開關盒來確定過濾器應該如何工作。