【发布时间】:2013-03-18 03:23:14
【问题描述】:
我遇到了一个奇怪的问题。我已经在堆栈溢出中进行了搜索,对于 JPA 和自定义查询,我应该指定参数。所以我有一个查询字符串,因为我有超过 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。在实体类中我有时间戳。但是我仍然无法正常工作,并且不确定我在哪里失败。
为了确保所有的事情都是他们应该做的,我强制查询是字符串,我得到了正确的异常:
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
但话又说回来,我更改为日期,但它失败了:S 我已经检查了这个 IllegalStateException 的原因:
从调试和javadoc 我得到以下信息: 获取结果列表
IllegalStateException - 如果为 Java Persistence 查询语言 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;
对于数据库创建脚本,列的创建方式如下:
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' and enddate
我得到了想要的结果。我想我可以使用本机查询,但这会解决问题而不是解决这个问题,对吧?
编辑 3: 虽然我已经正确设置了所有内容,但 bean 的 init 再次调用了没有 args 的查询(抱歉,谢谢大家的帮助。它帮助我检查了什么是错了)
【问题讨论】:
-
endate在 SQL 中是一个错字,对吧?应该是enddate?