首页 > 解决方案 > 如何让 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;

标签: javaspringpostgresqljpa

解决方案


我将把我的解决方案放在这里。

Hibernate 只是不明白->>is json/jsonb 运算符。我们需要把方法名绑定到操作符上。我们可以通过请求在 PSQL 中得到它:

select * from pg_operator where oprname = '->>'

对于我的 PSQL 9.4,它显示方法名称json_array_element_textoprcode列中。

所以我可以用以下内容替换它:

JpaSort.unsafe("json_array_element_text(extra, 'info')")

它对我有用。


推荐阅读