Hibernate QueryException:'并未设置所有命名参数' - 包含:: int的本机查询

时间:2013-02-20 15:23:20

标签: hibernate jpa-2.0 postgresql-8.4

在我们当前的项目中,我们需要查询long-matching-prefix类型,但该列被奇怪地定义为 bigint 。我们在下面的代码段中提出了解决方案,我们希望找到列 dc 中与参数?2 ?3 ?1 日期介于2个日期列之间。

以下是相关的依赖项:

  • Postresql 8.4
  • Hibernate 3.6.10
  • Hibernate JPA 1.0.1
  • Spring 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 作为参数但无法找到解决方案。

感谢您的帮助。

4 个答案:

答案 0 :(得分:2)

您可以将(select ?2/(10^i)::int8重写为CAST((select ?2/(10^i) AS INT8) 通常,任何类型广播都可以同时写成<data>::<type>CAST(<data> AS <type>) 这种形式是相同的,会得到相同的结果。

答案 1 :(得分:1)

您是否尝试使用:

query.setParameter(":int8", valid_date);

而不是:

query.setParameter(1, valid_date);

答案 2 :(得分:0)

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

public class LegacyDao extends JdbcDaoSupport

通过这种方式,我能够重用Hibernate正在使用的DataSource。

答案 3 :(得分:0)

尝试将双 \ 放在 : 之前

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