首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有ltree原生命名查询的hibernate

带有ltree原生命名查询的hibernate
EN

Stack Overflow用户
提问于 2018-12-26 23:00:20
回答 2查看 764关注 0票数 0

我正在尝试运行包含ltree函数和运算符的PostgreSQL原生查询。

定义如下:

代码语言:javascript
复制
@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")

调用方式如下:

代码语言:javascript
复制
public List<PathSegment> getPathChildren(String path, String lastSegment) {
    Query query = entityManager.createNamedQuery("pathSegmentQuery");
    String pathLike = "'*." + path + ".*'";

    query.setParameter("path", path);
    query.setParameter("pathLike", pathLike);
    query.setParameter("lastSegment", lastSegment);

    return query.getResultList();
}

结果是error ERROR: operator does not exist: ltree ~ character varying

当我尝试直接对数据库运行查询时,它运行正常:

代码语言:javascript
复制
select ltree2text(okm_path) as okm_path,
   index(okm_path, text2ltree('_root_')) + 2 <> nlevel(okm_path) as haschild,
   case
     when index(okm_path, text2ltree('_root_')) + 1 <> nlevel(okm_path)
             then ltree2text(subpath(okm_path, index(okm_path, text2ltree('_root_')) + 1, 1))
       end as child
from document
where
    okm_path ~ '*._root_.*'
and
    index(okm_path, text2ltree('_root_')) + 1 <> nlevel(okm_path)

从错误中可以明显看出hibernate(?)我不喜欢~操作符右侧的类型,但正如您所看到的,我在后面的查询中使用了该字符串,并且运行良好。

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

编辑:当我用"where okm_path ~ '*._root_.*' "替换okm_path ~ :pathLike时,我将得到:

org.postgresql.util.PSQLException: ERROR: syntax error at position 0错误

hibernate: 5.2.9

postgresql: 9.2.23

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-28 05:27:54

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

因此,我的查询转换为

代码语言:javascript
复制
...
where okm_path ~ lquery(:pathLike)
...

这就解决了这个问题

票数 3
EN

Stack Overflow用户

发布于 2018-12-26 23:11:23

错误

代码语言:javascript
复制
operator does not exist: ltree ~ character varying

应该理解为

代码语言:javascript
复制
operator does not exist: <left_data_type> <operator> <right_data_type> varying

这意味着没有为这些数据类型定义运算符。例如,当运算符的左侧是整数而右侧是varchar时,就会发生这种情况,错误是ERROR: operator does not exist: integer = character varying

这里的问题是,当您设置右侧的值时,

代码语言:javascript
复制
query.setParameter("pathLike", pathLike) 

pathLike是一个字符串。所以Postgres将其看作是将ltree与字符串进行比较。当您直接执行SQL时,右边是一个ltree表达式,而不是一个字符串。

我不确定这是否有效,但你能尝试一下ltree可以直接转换为varchar吗,但你能试试这个吗?:

代码语言:javascript
复制
query.setParameter("pathLike", pathLike, Hibernate.OBJECT)

另请参阅Java type in JDBC to Postgres ltree

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53933692

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档