java - 如何让 Jpa.unsafe 对 postgresql 中的 json 字段进行排序
问题描述
在 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]
似乎在休眠过程中发生了错误。
以下sql有效,所以我想通过jpa生成它。
SELECT * from tbl_user order by extra ->> 'info' desc;
解决方案
我将把我的解决方案放在这里。
Hibernate 只是不明白->>
is json/jsonb 运算符。我们需要把方法名绑定到操作符上。我们可以通过请求在 PSQL 中得到它:
select * from pg_operator where oprname = '->>'
对于我的 PSQL 9.4,它显示方法名称json_array_element_text
在oprcode
列中。
所以我可以用以下内容替换它:
JpaSort.unsafe("json_array_element_text(extra, 'info')")
它对我有用。
推荐阅读
- javascript - 如何在 HERE 地图的特定位置搜索图标(domMarker)?
- javascript - 反应中事件侦听器内的异步 API 调用处理程序
- api - 如何处理“应用程序暂时无法使用您的 Google 帐户登录”的障碍
- java - 使用 Spring 安全性时 Webjar 脚本不起作用
- python - 在图像中查找某个像素值
- javascript - SyntaxError:意外的令牌'?
- android - 更改“google-service.json”文件后,推送通知不适用于 FCM
- opengl - 使用 OpenGL 和纹理在同一窗口中查看 2x2 网格中的多个图像
- android - TabLayout 图标不显示
- sql - 地图数据 posgtresqsql