Java JPA,自定义查询和日期

Java JPA,自定义查询和日期,java,datetime,jpa,Java,Datetime,Jpa,我面临一个奇怪的问题。我已经在堆栈溢出中搜索了这里,对于JPA和自定义查询,我应该指定参数。所以我有一个查询字符串,因为我有超过14个字段,但我面临日期问题。我总是得到非法国家的例外 INFO: query STRING = SELECT t FROM Tickets t WHERE t.startdate > :startDate AND t.enddate < :endDate ORDER BY t.status DESC WARNING: #{ticketController

我面临一个奇怪的问题。我已经在堆栈溢出中搜索了这里,对于JPA和自定义查询,我应该指定参数。所以我有一个查询字符串,因为我有超过14个字段,但我面临日期问题。我总是得到非法国家的例外

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.
虽然我得到的是找不到参数,但我在setParameter中有它,并且在查询中也设置了它,如信息行中所示

有什么想法吗

提前谢谢

编辑:

对于数据库创建脚本,列的创建方式如下:

  startdate timestamp with time zone NOT NULL,
  endate timestamp with time zone,
如果我执行以下常规SQL查询: “从tbl_票证中选择*,其中开始日期>2012-02-01 00:00:00'和结束日期<'2013-03-18 23:59:50'”

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


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

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

Query q = em.createQuery(query).setParameter("startDate", startDate, TemporalType.TIMESTAMP).setParameter("endDate", endDate, TemporalType.DATE);
如果您仔细查看正在使用的,它会说此
setParameter
需要一个
位置参数
,而查看您的查询,您似乎使用了
命名参数

因此,
IllegalStateException
。将查询更改为提供
位置参数
,或将
设置参数
更改为提供
命名参数
作为输入

这就是在查询中提供位置参数的方式

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);
String query=“从Tickets t中选择t,其中t.startdate>?1和t.enddate<?2按t.status DESC排序”;
....
Query q=em.createQuery(Query).setParameter(1,startDate,TemporalType.TIMESTAMP).setParameter(2,endDate,TemporalType.DATE);
试试看

String query=“从Tickets t中选择t,其中t.startdate>?1和t.enddate<?2按t.status DESC排序”;
Query q=em.createQuery(Query).setParameter(1,startDate,TemporalType.TIMESTAMP).setParameter(2,endDate,TemporalType.DATE)

javadoc

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

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

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

  • Java值
    startDate
    的类型为
    Java.util.Date
    Java.util.Calendar

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


谢谢。在确认无问题后,我更新了问题。我还应该提到,当在数据库中创建记录时,startdate由应用程序自动设置,对象类型为date。而且它保存正确,没有错误。你真的让每个人都在猜测。请显示:a)用于创建表的SQL,以及b)Java实体的相关部分。代码中仍然缺少一部分-设置查询的变量和代码。这些变量是如何声明的?它们必须是java日期或日历,对吗?主要是因为上面的评论实际上帮助我找到了问题和解决方法。谢谢你提供的信息。正如你提到的,我已经试过了,但还是一样的问题。我只在调用q.getResultList时得到这个结果。在此之前,变量被正确地填充,尽管在调试模式下,我看到jpql查询被标记为“startdate>?”,非常感谢您的解释,我很长一段时间都没有看到命名vs位置。它说
IllegalArgumentException
,这意味着局部变量
startDate
不是
Date
类型。这似乎是唯一可能的情况。那是为了表明该行实际上正在执行。我在强制将类型设置为字符串时进行了测试。我仍然有州例外。嗯。。还有一个setParameter方法用于设置命名参数,我认为问题描述中的代码使用了它:
endate
在SQL中是一个拼写错误,对吗?应该是
enddate
  startdate timestamp with time zone NOT NULL,
  endate timestamp with time zone,
Query q = em.createQuery(query).setParameter("startDate", startDate, TemporalType.TIMESTAMP).setParameter("endDate", endDate, TemporalType.DATE);
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);
String query = "SELECT t FROM Tickets t  WHERE t.startdate > ?1 AND t.enddate < ?2 ORDER BY t.status DESC";
setParameter(String name, java.util.Date value, TemporalType temporalType)`
setParameter(String name, java.util.Calendar value, TemporalType temporalType)`