3

我面临一个奇怪的问题。我已经在堆栈溢出中进行了搜索,对于 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我得到以下信息: getResultList

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 < '2013-03-18 23:59:50'”

我得到了想要的结果。我想我可以使用本机查询,但这会解决问题而不是解决这个问题,对吧?

编辑 3:虽然我已经正确设置了所有内容,但 bean 的 init 再次调用了没有 args 的查询(对不起,谢谢大家的帮助。它帮助我检查出了什么问题)

4

4 回答 4

6

两者的 javadoc

setParameter(String name, java.util.Date value, TemporalType temporalType)`
setParameter(String name, java.util.Calendar value, TemporalType temporalType)`

状态:

抛出:IllegalArgumentException- 如果参数名称与查询的参数不对应,或者 value 参数的类型不正确

由于您没有提供完整的代码,请验证:

  • Java 值startDate的类型为java.util.Dateor java.util.Calendar

  • SQL 列startDate具有有效的 SQL 日期类型TIMESTAMP

于 2013-03-18T04:06:07.097 回答
1

我认为:(冒号)和 startDate 之间应该有一个空格。可能是考虑将:startDate作为一个单词。试试这个

于 2013-03-18T03:33:55.473 回答
1

尝试

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);

于 2013-03-18T03:37:15.320 回答
0
Query q = em.createQuery(query).setParameter("startDate", startDate, TemporalType.TIMESTAMP).setParameter("endDate", endDate, TemporalType.DATE);

如果您仔细查看setParameter您正在使用的 ,它会说这setParameter需要 a 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);
于 2013-03-18T03:36:16.227 回答