Hibernate setParemeter 基于 1 还是基于 0?查询参数异常

Hibernate setParemeter 1-based or 0-based? QueryParameterException

假设其他一切都像魅力一样工作(实体、命名查询、本机命名查询)我在尝试 运行 后续查询时遇到奇怪的异常,其中日期列类型为 TIMESTAMP

@NamedNativeQuery(name = "problematicQuery", query = "DELETE FROM mytable WHERE date < ?")

我正在尝试使用以下代码执行此查询,其中日期为 java.sql.Timestamp:

Query deleteQuery = em.createNativeQuery("problematicQuery");
deleteQuery.setParameter(1, date);
deleteQuery.executeUpdate();

此代码导致以下异常:

org.hibernate.QueryParameterException: Position beyond number of declared ordinal parameters. Remember that ordinal parameters are 1-based! Position: 1

当我将中间代码行更改为:

Query deleteQuery = em.createNativeQuery("problematicQuery");
deleteQuery.setParameter(0, date);
deleteQuery.executeUpdate();

我会得到不同位置的相同异常:

org.hibernate.QueryParameterException: Position beyond number of declared ordinal parameters. Remember that ordinal parameters are 1-based! Position: 0

我正在使用 JBoss 7.2.0.Final(Hibernate 版本是 4.2.0.CR1),Oracle 11g.

怎么了?我错过了什么吗?

您应该在 JPA QL 中使用命名参数:@NamedNativeQuery(name = "problematicQuery", query = "DELETE FROM mytable WHERE date < :dt"

deleteQuery.setParameter("dt", date);

看来你用错了方法

em.createNamedQuery("problematicQuery")

而不是

em.createNativeQuery("problematicQuery");

在您的例子中,查询是从字符串 "problematicQuery" 创建的,其中不存在任何参数