java - JPA、自定义查询和日期

标签 java datetime jpa

我遇到了一个奇怪的问题。我在堆栈溢出中进行了搜索,对于 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 查询,例如: “从 tbl_tickets 中选择 *,其中开始日期 > '2012-02-01 00:00:00' 和结束日期 < '2013-03-18 23:59:50'”

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

编辑 3: 虽然我已正确设置所有内容,但 bean 的初始化再次调用没有参数的查询(抱歉,谢谢大家的帮助。它帮助我检查了是什么错了)

最佳答案

两者的 javadoc

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

状态:

Throws: IllegalArgumentException - if the parameter name does not correspond to a parameter of the query or if the value argument is of incorrect type

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

  • Java 值 startDatejava.util.Datejava.util.Calendar 类型。

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

关于java - JPA、自定义查询和日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15469284/

相关文章:

java - 同一范围内的同名局部变量,IDE 显示错误,但当我运行程序时,没有运行时错误结果

MySQL 查询或过程从多行计算的值返回表

java - Spring Jpa并发事务和陈旧数据

java - 声明中的Android AsyncTask错误

java - 当 AsyncTask 也使用另一个线程时如何设置延迟时间?

php 和 javascript 日期不匹配

c# 比较 DateTime start 和 DateTime stop 与 List<DateTime>

java - 将 Spring/Hibernate 应用程序连接到 Docker 中运行的 Mysql

mysql - JPA 在同一事务中插入父实体和子实体

java - 设置 Eclipse 不在接口(interface)中的方法声明之间插入空行?