Ttt*_*ing 5 java postgresql spring jpa
在 spring jpa doc 中,该示例显示了一种通过 Length(field) 等 sql 函数进行排序的方法。
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)"));
Run Code Online (Sandbox Code Playgroud)
所以我尝试在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'"));
Run Code Online (Sandbox Code Playgroud)
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]
Run Code Online (Sandbox Code Playgroud)
似乎在休眠过程中发生错误。
以下sql有效,所以我想通过jpa生成它。
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)"));
Run Code Online (Sandbox Code Playgroud)
我将把我的解决方案放在这里。
Hibernate 只是不理解 is ->>
json/jsonb 运算符。我们需要把方法名绑定到操作符上。我们可以通过以下请求在 PSQL 中获取它:
select * from pg_operator where oprname = '->>'
Run Code Online (Sandbox Code Playgroud)
对于我的 PSQL 9.4,它显示方法名称是列json_array_element_text
中的oprcode
。
所以我可以用以下内容替换它:
JpaSort.unsafe("json_array_element_text(extra, 'info')")
Run Code Online (Sandbox Code Playgroud)
它确实对我有用。
归档时间: |
|
查看次数: |
795 次 |
最近记录: |