gpt4 book ai didi

java - 如何让 Jpa.unsafe 对 postgresql 中的 json 字段进行排序

转载 作者:行者123 更新时间:2023-12-03 11:20:21 24 4
gpt4 key购买 nike

在 spring jpa doc 中,该示例显示了一种通过 Sql 函数(如 Length(field))进行排序的方法。

public interface UserRepository extends JpaRepository<User, Long> {

@Query("select u from User u where u.lastname like ?1%")
List<User> findByAndSort(String lastname, Sort sort);

@Query("select u.id, LENGTH(u.firstname) as fn_len from User u where u.lastname like ?1%")
List<Object[]> findByAsArrayAndSort(String lastname, Sort sort);
}

repo.findByAndSort("targaryen", JpaSort.unsafe("LENGTH(firstname)"));

所以我尝试在postgres中对一个json字段进行排序,代码就像
@Query("select u from User u where u.loginName like ?1%")
List<User> findByAndSort(String loginName, Sort sort);

repo.findAllAndSort("jack", JpaSort.unsafe("extra ->> 'info'"));

extra 是 postgres 中字段的名称,它是 jsonb 类型。

不幸的是,它返回错误:
org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: > near line 1, column 88 [select u from com.xx.user.model.User u where u.loginName like ?1 order by u.extra ->> 'info' asc]

似乎在 hibernate 过程中发生了错误。

以下sql有效,所以我想通过jpa生成它。

SELECT * from tbl_user order by extra ->> 'info' desc;

最佳答案

我将把我的解决方案放在这里。
Hibernate 只是不明白 ->>是 json/jsonb 运算符。
我们需要把方法名绑定(bind)到操作符上。
我们可以通过请求在 PSQL 中得到它:

select * from pg_operator where oprname = '->>'
对于我的 PSQL 9.4,它显示方法名称是 json_array_element_textoprcode柱子。
所以我可以用以下内容替换它:
JpaSort.unsafe("json_array_element_text(extra, 'info')")
它对我有用。

关于java - 如何让 Jpa.unsafe 对 postgresql 中的 json 字段进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58496198/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com