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
参数并直接硬编码一些值时会发生什么。