3

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

以下是相关的依赖项:

  • Postresql 8.4
  • 休眠 3.6.10
  • 休眠 JPA 1.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作为参数但找不到解决方案。

谢谢您的帮助。

4

4 回答 4

2

你可以重写(select ?2/(10^i)::int8CAST((select ?2/(10^i) AS INT8).
一般来说,任何类型转换都可以写成<data>::<type>and CAST(<data> AS <type>)
这种形式是相同的,将给出相同的结果。

于 2015-09-23T13:21:16.253 回答
1

您是否尝试使用:

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

代替:

query.setParameter(1, valid_date);
于 2013-02-21T11:09:41.660 回答
0

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

public class LegacyDao extends JdbcDaoSupport

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

于 2014-10-30T14:08:14.263 回答
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();
...
于 2021-06-24T01:28:28.840 回答