Java hibernate与ltree本机命名查询

Java hibernate与ltree本机命名查询,java,postgresql,hibernate,ltree,Java,Postgresql,Hibernate,Ltree,我正在尝试运行包含ltree函数和运算符的PostgreSQL本机查询 定义如下: @NamedNativeQuery( name = "pathSegmentQuery", query = "select ltree2text(okm_path) as okm_path, " + " index(okm_path, text2ltree(:lastSegment)) + 2 <> n

我正在尝试运行包含
ltree
函数和运算符的PostgreSQL本机查询

定义如下:

@NamedNativeQuery(
            name = "pathSegmentQuery",
            query = "select ltree2text(okm_path) as okm_path, " +
                    "       index(okm_path, text2ltree(:lastSegment)) + 2 <> nlevel(okm_path) as haschild, " +
                    "       case " +
                    "         when index(okm_path, text2ltree(:lastSegment)) + 1 <> nlevel(okm_path) " +
                    "                 then ltree2text(subpath(okm_path, index(okm_path, text2ltree(:lastSegment)) + 1, 1)) " +
                    "           end as child " +
                    "from document " +
                    "where okm_path ~ :pathLike " +
                    "and " +
                    "index(okm_path, text2ltree(:path)) + 1 <> nlevel(okm_path) ",
            resultSetMapping = "pathSegmentQueryRSMapping")
从错误中可以明显看出,hibernate(?)不喜欢th
~
运算符右侧的类型,但正如您所看到的,我在后面的查询中使用了字符串,效果很好

那么,我需要如何处理hibernate查询才能成功运行查询

编辑: 当我为
替换
okm\u path~:pathLike
“where okm\u path~”*。\u root.*'
时,我将得到:

org.postgresql.util.PSQLException:错误:位置0处的语法错误
ERROR

冬眠:5.2.9.1决赛

postgresql:9.2.23

错误

operator does not exist: ltree ~ character varying
应理解为

operator does not exist: <left_data_type> <operator> <right_data_type> varying
pathLike
是一个字符串。因此Postgres将此视为将ltree与字符串进行比较。当您直接执行SQL时,右侧被视为ltree表达式而不是字符串

我不确定这是否有效,但您可以尝试将ltree直接转换为varchar,但您可以尝试吗?:

query.setParameter("pathLike", pathLike, Hibernate.OBJECT)
另请参见错误

operator does not exist: ltree ~ character varying
应理解为

operator does not exist: <left_data_type> <operator> <right_data_type> varying
pathLike
是一个字符串。因此Postgres将此视为将ltree与字符串进行比较。当您直接执行SQL时,右侧被视为ltree表达式而不是字符串

我不确定这是否有效,但您可以尝试将ltree直接转换为varchar,但您可以尝试吗?:

query.setParameter("pathLike", pathLike, Hibernate.OBJECT)

另请参见

事实证明,在对lquery执行操作时,需要调用
lquery()
函数

所以我的问题转化为

...
where okm_path ~ lquery(:pathLike)
...

这就解决了问题

事实证明,在对lquery执行操作时,需要调用
lquery()
函数

所以我的问题转化为

...
where okm_path ~ lquery(:pathLike)
...

这就解决了问题

当我将左侧ltree转换为
ltree2text(okm路径)~'*.\u root.*.
时,它会给出
[2201B]错误:无效正则表达式:量词操作数无效
。我需要右侧的
lquery
。但是没有像
text2lquery
这样的函数,所以hibernate无法理解它以某种方式向用户提供了错误的信息postgre@greengold我懂了。我认为问题在于,当您从hibernate传递
*。\u root.*
时,它作为字符串传递(因为
pathLike
query.setParameter(“pathLike”,pathLike)
)中的字符串),而当您直接执行查询(或硬编码值)时,参数被视为ltree表达式而不是字符串。我不太熟悉ltree,所以我不确定是否有办法显式设置ltree表达式。@greengold您能试试
query.setParameter(“pathLike”,pathLike,Hibernate.OBJECT)
?另请参见第一条,
Query
仅接受
TemporalType
作为第三个参数。在链接的线程中,第三个参数被设置为prepared语句。然后,
TemporalType
中只定义了日期、时间和时间戳枚举,因此没有真正匹配我的情况。我已经编辑了我的问题,并添加了当我省略查询的
:pathLike
参数并直接硬编码一些值时会发生的情况。当我将左侧ltree转换为
ltree2text(okm路径)~'*.\u root.*.
时,它给出了
[2201B]错误:无效正则表达式:量词操作数无效
。我需要右侧的
lquery
。但是没有像
text2lquery
这样的函数,所以hibernate无法理解它以某种方式向用户提供了错误的信息postgre@greengold我懂了。我认为问题在于,当您从hibernate传递
*。\u root.*
时,它作为字符串传递(因为
pathLike
query.setParameter(“pathLike”,pathLike)
)中的字符串),而当您直接执行查询(或硬编码值)时,参数被视为ltree表达式而不是字符串。我不太熟悉ltree,所以我不确定是否有办法显式设置ltree表达式。@greengold您能试试
query.setParameter(“pathLike”,pathLike,Hibernate.OBJECT)
?另请参见第一条,
Query
仅接受
TemporalType
作为第三个参数。在链接的线程中,第三个参数被设置为prepared语句。然后,
TemporalType
中只定义了日期、时间和时间戳枚举,因此没有真正匹配我的情况。我已经编辑了我的问题,并添加了当我省略查询的
:pathLike
参数并直接硬编码一些值时会发生什么。