Spring Data JPA:如何在jsonb字段上排序

wfypjpf4  于 2023-06-21  发布在  Spring
关注(0)|答案(1)|浏览(189)

我使用Specification查询包含jsonb列的表。我想对jsonb列中名为“type”的字段进行排序。(在postgresql中,想要的结果类似于ORDER BY content->>'type'
我试过使用JpaSort像mentionned在这SO,但它不工作!
另一个对我有效的解决方案是使用@Formula,但我必须对所有的json嵌套字段使用它。不是优雅的解决方案。在这种情况下,我更喜欢使用单独的列。

@Entity
@TypeDef(name = "jsonb", typeClass = JsonBinaryType.class)
public class MyEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    //this works but not wanted
    //@Formula("content->>'type'")
    //private String type;

    @Type(type = "jsonb")
    @Column(columnDefinition = "jsonb")
    private Map<String, Object> content;
}
myEntityRepository.findAll(hasIdSpecification(5), new new OffsetPageRequest(0, 10, sort()));

sort()

JpaSort.unsafe(Direction.ASC, "jsonb_array_elements_text(content, 'type')")

我得到以下错误

org.springframework.data.mapping.PropertyReferenceException: No property 'jsonb' found for type 'MyEntity'!
    at org.springframework.data.mapping.PropertyPath.<init>(PropertyPath.java:90)
    at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:437)
    at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:413)
    at org.springframework.data.mapping.PropertyPath.lambda$from$0(PropertyPath.java:366)
    at java.base/java.util.concurrent.ConcurrentMap.computeIfAbsent(ConcurrentMap.java:330)
    at org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:348)
    at org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:331)

QueryUtils.toJpaOrder将在''字符上分割postgresql函数,因此将在我的实体中查找'jsonb'字段。
有没有办法转义下划线'
'?或者给我另一个解决方案

cl25kdpy

cl25kdpy1#

正确的答案是不。
对于.findAll(Sort sort)这类继承的main方法,**只能使用对象属性来定义我们的sort,*否则会得到No property '?' found for type '?'!错误!
当我们使用JPQL进行查询定义时,
Spring Data * 可以毫无问题地处理排序-我们所要做的就是在MyEntityRepository文件中添加一个Sort类型的方法参数。

@Query(value = "SELECT e FROM MyEntity e")
List<MyEntity> findAllForJSON(Sort sort);

-- OR --

@Query(value = "SELECT e FROM MyEntity e")
Page<MyEntity> findAllForJson(Pageable pageable);

因此,您需要混合使用@QuerySpecification来获得您想要的but you can't mix @Query and Specification .
因此;你需要一个特殊的方法来使用 * jsonb_array_elements_text * 函数,但是我们不能在规范中使用这个方法。

相关问题