我使用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'
字段。
有没有办法转义下划线''?或者给我另一个解决方案
1条答案
按热度按时间cl25kdpy1#
正确的答案是不。
对于
.findAll(Sort sort)
这类继承的main方法,**只能使用对象属性来定义我们的sort,*否则会得到No property '?' found for type '?'!
错误!当我们使用JPQL进行查询定义时,
Spring Data
* 可以毫无问题地处理排序-我们所要做的就是在MyEntityRepository
文件中添加一个Sort类型的方法参数。-- OR --
因此,您需要混合使用
@Query
和Specification
来获得您想要的but you can't mix@Query
andSpecification
.因此;你需要一个特殊的方法来使用 *
jsonb_array_elements_text
* 函数,但是我们不能在规范中使用这个方法。