Java NamedQuery并将日期设置为参数

时间:2014-01-21 10:36:40

标签: java hibernate entity hql

我在Entity中创建了简单的@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 date应该在“”中,如下所示:productcha0_.date =“2014-01-20”

我该怎么办?

我试过

.setDate("date", date)


.setParameter("date", date)

并且它不起作用。

3 个答案:

答案 0 :(得分:1)

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

Hibernate Annotations

“在普通Java API中,未定义时间的时间精度。在处理时态数据时,您可能希望描述数据库中的预期精度。时态数据可以具有DATE,TIME或TIMESTAMP精度(即实际日期) ,只有时间,或两者兼而有之。)使用@Temporal注释来微调它。“

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

答案 1 :(得分:0)

如果您=运算符,parameter date必须与DB的日期格式相同,则完全相同。我认为,在=JPQL中使用hql运算符作为日期参数的风险就像。 我建议您使用><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

答案 2 :(得分:-1)

你需要在&#34;:&#34;之间没有空格。和&#34; =&#34;。所以应该阅读

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