JPA,自定义查询和日期
我面临一个奇怪的问题。 我在这里搜索包含堆栈溢出,对于JPA和Custom查询,我应该指定参数。 所以我有一个查询字符串,因为我有超过14个字段,但我面临着日期的问题。 我总是得到IllegalStateException
INFO: query STRING = SELECT t FROM Tickets t WHERE t.startdate > :startDate AND t.enddate < :endDate ORDER BY t.status DESC WARNING: #{ticketController.search}: java.lang.IllegalStateException: Query argument startDate not found in the list of parameters provided during query execution.
至于我的查询:
Query q = em.createQuery(query).setParameter("startDate", startDate, TemporalType.TIMESTAMP).setParameter("endDate", endDate, TemporalType.DATE);
虽然我得到的参数没有找到,但我在setParameter中有它,并且在INFO行中看到的查询中也设置了它。
有任何想法吗?
提前致谢
编辑:
INFO: query STRING = SELECT t FROM Tickets t WHERE t.startdate > ?1 AND t.enddate < ?2 ORDER BY t.status DESC WARNING: #{ticketController.search}: java.lang.IllegalStateException: Query argument 1 not found in the list of parameters provided during query execution. q = em.createQuery(query).setParameter(1, startDate, TemporalType.TIMESTAMP).setParameter(2, endDate, TemporalType.TIMESTAMP);
另外,根据建议,我已经检查过我使用的日期是java.util.Date。 在实体类中我有Timestamp。 但我仍然无法做到这一点,也不确定我失败的地方。
只是为了确保所有的东西都是他们应该的,我强迫查询成为字符串,我得到了正确的例外:
INFO: query STRING = SELECT t FROM Tickets t WHERE t.startdate > :startDate AND t.enddate < :endDate ORDER BY t.status DESC WARNING: #{ticketController.search}: java.lang.IllegalArgumentException: You have attempted to set a value of type class java.lang.String for parameter startDate with expected type of class java.util.Date
但话说回来,我改变了日期并且失败了:我已经检查了这个IllegalStateException的原因:
从调试和javadoc我得到以下内容:getResultList
IllegalStateException – 如果调用Java持久性查询语言UPDATE或DELETE语句。
我没有做更新也没有删除:/
编辑2:添加实体相关部分:
@Basic(optional = false) @NotNull @Column(name = "startdate") @Temporal(TemporalType.TIMESTAMP) private Date startdate; @Column(name = "enddate") @Temporal(TemporalType.TIMESTAMP) private Date enddate;
对于数据库创建脚本的AS,正在创建列,如下所示:
startdate timestamp with time zone NOT NULL, endate timestamp with time zone,
如果我执行正常的SQL查询,例如:“select * from tbl_tickets where startdate>’2012-02-01 00:00:00’并enddate <'2013-03-18 23:59:50'”
我得到了理想的结果。 我想我可以使用原生查询,但这将解决问题,而不是解决这个问题,对吧?
编辑3:虽然我已经正确设置了所有内容,但bean的init再次调用了没有args的查询(抱歉,谢谢大家的帮助。它帮助我检查了什么是错误的)
两个javadoc
setParameter(String name, java.util.Date value, TemporalType temporalType)` setParameter(String name, java.util.Calendar value, TemporalType temporalType)`
状态:
抛出:
IllegalArgumentException
– 如果参数名称不对应查询的参数或者value参数的类型不正确
由于您未提供完整代码,请validation:
-
Java值
startDate
的类型为java.util.Date
或java.util.Calendar
。 -
SQL列
startDate
具有有效的SQL日期类型TIMESTAMP
。
我认为在它们之间应该有一个空格🙁冒号)和startDate。 可能是在考虑:startDate作为一个单词。 试一试
尝试
String query = "SELECT t FROM Tickets t WHERE t.startdate > ?1 AND t.enddate < ?2 ORDER BY t.status DESC";
Query q = em.createQuery(query).setParameter(1, startDate, TemporalType.TIMESTAMP).setParameter(2, endDate, TemporalType.DATE);
Query q = em.createQuery(query).setParameter("startDate", startDate, TemporalType.TIMESTAMP).setParameter("endDate", endDate, TemporalType.DATE);
如果你仔细查看你正在使用的setParameter
,它会说这个setParameter
需要一个Positional Parameter
,而看到你的查询,你似乎已经使用了Named Parameter
。
因此, IllegalStateException
。 更改查询以提供Positional Parameters
,或更改setParameter
以提供Named Parameters
作为输入。
这是您在查询中提供Positional Parameter
的方法。
String query = "SELECT t FROM Tickets t WHERE t.startdate > ?1 AND t.enddate < ?2 ORDER BY t.status DESC"; .... Query q = em.createQuery(query).setParameter(1, startDate, TemporalType.TIMESTAMP).setParameter(2, endDate, TemporalType.DATE);