【问题标题】:JPQL BETWEEN Date IntervalJPQL BETWEEN 日期间隔
【发布时间】:2015-06-22 23:16:11
【问题描述】:

我试图在某个日期间隔内获取所有 MainIntervals。但我总是为空。

这里是 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 调用它时,结果列表始终为空。虽然我有一些 MainIntervals 满足 startDate 和 endDate 之间的条件。

我将非常感谢每个答案或教程链接。 此致!

【问题讨论】:

  • 真的为空吗?我会理解它是否为空,但不为空。
  • 嗨,JB 尼泽特。好吧,我现在再次测试它。你说的对。它是空的而不是空的。但是,当我使用例如 findMainIntervalsBetween(10.05.2012, 20.05.2012) 调用该方法时,尽管在数据库中我有 MainIntervals ([01.05.2012, 31.05.2012], [01.05.2012, 01.08.2012 ] 日期模式模式="dd/MM/yyyy"。有什么想法吗?
  • 很高兴你能接受这个答案,因为它(包括后面的评论)似乎很合适,我建议你也应该投票。

标签: jpql


【解决方案1】:

您的查询是:

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, 01.08.2012]。查询的参数是 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

所以第二行也不返回。

在我看来一切都很正常。

【讨论】:

  • :-) 。实际上。非常感谢。我想我连续工作了 8 个小时 :-)。数据表还有另一个问题。我现在将其发布。我希望你也能这么快回答:-)
  • 但这并不能解决我的问题:-)。我想获取包含输入的 MainInterval 的所有 MainInterval!例如,如果保存的是 [01.05.2012, 31.05.2012], [01.05.2012, 01.08.2012] 那么如果我输入 [10.05.2012, 20.05.2012] 那么我想获得两个保存的间隔。 MyQuery 获取 MainInterval 内的所有 MainInterval!于是我就空了。有什么想法吗?
  • 如果我理解正确,您想获取与作为参数传递给查询的间隔重叠的所有间隔,对吗?如果是这样,select m from MainInterval m where :startDate &lt;= m.mainIntervalEnd and :endDate &gt;= m.mainIntervalStart
猜你喜欢
  • 2012-04-25
  • 2011-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-04
  • 1970-01-01
  • 2011-01-23
  • 2013-11-27
相关资源
最近更新 更多