Hibernate QueryException:&x27;并非所有命名参数都已设置';-使用包含::int的本机查询

Hibernate QueryException:&x27;并非所有命名参数都已设置';-使用包含::int的本机查询,hibernate,jpa-2.0,postgresql-8.4,Hibernate,Jpa 2.0,Postgresql 8.4,在我们当前的项目中,我们需要一个长匹配前缀类型的查询,但奇怪的是,该列被定义为bigint。我们在下面的代码片段中找到了解决方案,我们希望在dc列中找到与参数?2和?3匹配的最长数字,并且?1日期在两个日期列之间 以下是相关的依赖项: PostResql8.4 休眠3.6.10 HibernateJPA1.0.1 春季3.2.1 资料来源如下: ... String query_string = "SELECT * FROM numberlist WHERE " +

在我们当前的项目中,我们需要一个长匹配前缀类型的查询,但奇怪的是,该列被定义为bigint。我们在下面的代码片段中找到了解决方案,我们希望在dc列中找到与参数?2和?3匹配的最长数字,并且?1日期在两个日期列之间

以下是相关的依赖项:

  • PostResql8.4
  • 休眠3.6.10
  • HibernateJPA1.0.1
  • 春季3.2.1
资料来源如下:

...
String query_string = "SELECT * FROM numberlist WHERE " +
            "?1 BETWEEN init_date AND COALESCE(end_date,'2999-12-31') " +
            "AND dc IN " +
            "(select ?2/(10^i)::int8 from generate_series(0,floor(log(?3))::int) i) " +
            "ORDER BY dc DESC LIMIT 1";

Query query = emf.createEntityManager().createNativeQuery(query_string, MyNumber.class);
    query.setParameter(1, valid_date);
    query.setParameter(2, num);
    query.setParameter(3, num);

MyNumber result = (MyNumber)query.getSingleResult();
...
我们得到以下例外情况:

Caused by: org.hibernate.QueryException: Not all named parameters have been set: [:int8, :int]
我们认为问题在于Hibernate将:int和:int8作为参数,但无法找到解决方案

谢谢您的帮助。

您是否尝试使用:

query.setParameter(":int8", valid_date);
而不是:

query.setParameter(1, valid_date);

正如我在上述评论中所述,我最终使用了:

public class LegacyDao extends JdbcDaoSupport
通过这种方式,我可以重用Hibernate使用的数据源。

您可以将
(选择?2/(10^I)::int8
as
CAST((选择?2/(10^I)as int8)

一般来说,任何类型的强制转换都可以写成
强制转换(as)

这些表单是相同的,并将给出相同的结果。

您好,我最终使用了公共类LegacyDao扩展了JDBCDAO支持,因此我重用了Hibernate正在使用的数据源,它可以正常工作。