在我们当前的项目中,我们需要查询long-matching-prefix类型,但该列被奇怪地定义为 bigint 。我们在下面的代码段中提出了解决方案,我们希望找到列 dc 中与参数?2 和?3 <匹配的最长数字,?1 日期介于2个日期列之间。
以下是相关的依赖项:
以下是来源:
...
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 作为参数但无法找到解决方案。
感谢您的帮助。
答案 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();
...