2012-05-19 85 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' –