2014-01-21 33 views
1

我创建简单的@NamedQuery在实体:的Java NamedQuery并设定日期参数

@NamedQueries({ 
     @NamedQuery(name = ProductChangeLog.GetByDate, query = "From ProductChangeLog where date = :date ") 
}) 

日期是Date.sql

,我想执行这个查询:

List<ProductChangeLog> productChangeLogs = session.getNamedQuery(ProductChangeLog.GetByDate) 
      .setString("date", date) 
      .list(); 

我的问题是,这@NamedQuery产生查询:

Hibernate: select productcha0_.id as id21_, productcha0_.availible as availible21_, productcha0_.category as category21_, productcha0_.date as date21_, productcha0_.description as descript5_21_, productcha0_.name as name21_, productcha0_.partnerId as partnerId21_, productcha0_.price as price21_, productcha0_.producent as producent21_, productcha0_.productId as productId21_, productcha0_.productUrl as productUrl21_, productcha0_.status as status21_ from ProductChangeLog productcha0_ where productcha0_.date=2014-01-20 

这个查询是错误的,cose日期应该在“”中,像这样:productcha0_.date =“2014-01-20”

我该怎么办?

我已经试过

.setDate("date", date) 


.setParameter("date", date) 

而且门槛不工作。

+0

你可以发布任何堆栈跟踪?你在查询中错过了“SELECT”关键词吗? – CycDemo

+0

这是HQL,我不必添加SELECT。 – Ilkar

+0

没有堆栈跟踪 - 我没有这个查询的结果。 – Ilkar

回答

0

如果你=运营商,parameter date必须是相同的日期形式数据库,确切地说。我想,这就像使用=运算符作为日期参数的风险JPQLhql。 我建议使用><BETWEEN运营商。

WHERE Adate > Bdate      => Adate is before Bdate 
WHERE Adate < Bdate      => Adate is after Bdate 
WHERE Cdate BETWEEN Adate AND Bdate  => Cdate is between Adate and Bdate 
+0

它不工作 – Ilkar

1

您的ProductChangeLog pojo中的日期字段是否使用正确的Temporal注释?

Hibernate Annotations

“在普通的Java API,时间的时间精度没有定义。当处理时间类型数据,你可能要描述数据库中所预期的精度。时态数据可以有DATE,TIME或TIMESTAMP精确度(即实际日期,只有时间,或两者)。使用@Temporal注释来微调。“

@Temporal(TemporalType.TIMESTAMP) 
@Temporal(TemporalType.DATE) 
@Temporal(TemportalType.TIME) 
+0

我已经添加了它,但没有任何更改。 – Ilkar

-1

您需要在“:”和“=”之间没有空格。所以它应该阅读

@NamedQueries({ 
     @NamedQuery(name = ProductChangeLog.GetByDate, query = "From ProductChangeLog where date =:date ") 
})