【问题标题】:Hibernate Native Query problem with named parameters带有命名参数的 Hibernate Native Query 问题
【发布时间】:2011-02-17 04:59:25
【问题描述】:
我遇到了 Hibernate Native Query 的问题。我有一个选择数组切片(PostgreSQL 数据库)的 SELECT。
问题是休眠识别以下部分:“SELECT my_array[1:300]...”中的“:300”作为命名参数,我得到以下异常:并非所有命名参数都已设置。
我尝试使用 ':' 、 '::' 转义冒号 (:) 但没有成功。
Hibernate 版本是 3.2
【问题讨论】:
标签:
java
sql
hibernate
postgresql
【解决方案1】:
我不使用 PostgreSQL,但如果您没有找到适合此问题的解决方案,您可以实现一个拦截器(扩展 EmptyInterceptor)并在 onPrepareStatement(String sql) 上修改您的查询。
这意味着您可以使用 my_array[1|300] 之类的东西并将其重写为 my_array[1:300] 以解决命名参数问题。
编辑:我不能 100% 确定上述方法是否有效(重写本机 SQL 以及查询解析器是否允许使用特殊字符)。我只在 HQL 和条件中完成了上述操作,其中我将索引提示作为查询注释传递。
【解决方案2】:
冒号在 Hibernate 本身中是不可转义的(自 2005 年以来已知为 Bug)。
【解决方案3】:
create function array_slice(a anyarray, start int4, end int4) returns anyarray as
$$
SELECT a[start:end];
$$
language(sql);
现在改为调用此函数。没试过,但它会像这样工作。