2012-05-19 181 views
0

我試圖在特定的日期間隔內獲取所有MainIntervals。但我總是空。JPQL BETWEEN日期間隔

這裏是JPA實體

@Table(name="MAIN_INTERVAL") 
@NamedQueries({ 
@NamedQuery(name = MainInterval.FIND_ALL, query = " select m from MainInterval m"), 
@NamedQuery(name = MainInterval.FIND_BETWEEN, 
    query = "select m from MainInterval m where m.mainIntervalStart 
    BETWEEN :startDate AND :endDate 
    AND m.mainIntervalEnd BETWEEN :startDate AND :endDate" 
    ) }) 


public class MainInterval implements Serializable { 

public static final String FIND_ALL = "MainInterval.findAll"; 
public static final String FIND_BETWEEN = "MainInterval.findBetween"; 

private static final long serialVersionUID = 1L; 
@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
@Column(name="MAIN_INTERVAL_ID") 
private Long id; 

@Column(name="MAIN_INTERVAL_START") 
@Temporal(javax.persistence.TemporalType.DATE) 
private Date mainIntervalStart; 

@Column(name="MAIN_INTERVAL_END") 
@Temporal(javax.persistence.TemporalType.DATE) 
private Date mainIntervalEnd; } 

而在EJB SessionBeans我的方法:

public List<MainInterval> findMainIntervalsBetween(Date startDate, Date endDate){ 
     List<MainInterval> resultList = em.createNamedQuery(MainInterval.FIND_BETWEEN, MainInterval.class) 
       .setParameter("startDate", startDate, TemporalType.DATE).setParameter("endDate", endDate, TemporalType.DATE).getResultList(); 
     return resultList; 
} 

但是,當我與CDI把它從JSF的resultList總是空。雖然我有一些滿足startDate和endDate之間條件的MainIntervals。

我會非常感謝每個答案或鏈接的教程。 此致敬禮!

+0

它真的是空嗎?我會理解它是否爲空,但不爲空。 –

+0

嗨JB Nizet。那麼我現在再測試它。你是對的。它不爲空。但是當我使用例如findMainIntervalsBetween(10.05.2012,20.05.2012)調用該方法時,我得不到任何東西,儘管在數據庫中我有MainIntervals([01.05.2012,31.05.2012],[01.05.2012,01.08.2012 ] Date pattern pattern =「dd/MM/yyyy」。任何想法? – Laith

+0

接受答案是很好的,因爲它(包括後面的評論)看起來非常合適,我建議你也應該注意。 –

回答

3

您所查詢的是:

select m from MainInterval m where m.mainIntervalStart 
BETWEEN :startDate AND :endDate 
AND m.mainIntervalEnd BETWEEN :startDate AND :endDate 

你的第一行的區間爲[01.05.2012,31.05.2012],和你的第二排的區間爲[01.05.2012,2012年8月1日。查詢的參數是10.05.2012,20.05.2012。

所以,你的第一行:

m.mainIntervalStart BETWEEN :startDate AND :endDate 
01.05.2012   BETWEEN 10.05.2012 AND 20.05.2012 : false 

所以第一行不會返回。

關於你的第二排:

m.mainIntervalStart BETWEEN :startDate AND :endDate 
01.05.2012   BETWEEN 10.05.2012 AND 20.05.2012 : false 

所以第二排也不會被退還。

一切看起來都很正常。

+0

:-)。事實上。非常感謝你。我認爲我工作了8個小時不休息:-)。 dataTable還有另外一個問題。我會立即發佈。我希望你能很快回答它:-) – Laith

+0

但是這並不能解決我的問題:-)。我想獲取包含輸入的MainInterval的所有MainIntervals!例如,如果保存的是[01.05.2012,31.05.2012],[01.05.2012,01.08.2012],那麼如果我輸入[10.05.2012,20.05.2012],那麼我想要得到兩個保存的間隔。 MyQuery獲取MainInterval中的所有MainIntervals!因此我得到了空虛。有任何想法嗎? – Laith

+0

如果我理解正確,您希望獲取與作爲參數傳遞給查詢的時間間隔重疊的所有間隔,是嗎?如果是這樣,'從MainInterval m中選擇m其中:startDate <= m.mainIntervalEnd和:endDate> = m.mainIntervalStart' –