spring-data - 如何使用spring数据规范查询jsonb列?
问题描述
我有下表temp_tbl(postgres):
ID(int) NAME(TEXT) LINKS(jsonb)
-------- ---------- -------------------
1 Name1 ["1","23","3", "32]
2 Name2 ["11","3","31", "2]
3 Name3 ["21","13","3", "12]
现在我的本机查询获取具有“LINKS”且值为“3”的行是:
select * from temp_tbl where links @> '["3"]'
返回第 2 行和第 3 行。
我想使用 org.springframework.data.jpa.domain.Specification 实现这个查询
我已经实现了类似下面的内容,其中 jsonb 列不是数组,但使用jsonb_extract_path_text具有键值 json 。但是上面的列仅将值存储在数组中。
我的实体类。
@Entity
@Table(name = "temp_tbl")
public class TempTbl {
@Id
@Column(name = "ID")
private Long id;
@Column(name = "NAME", nullable = false)
private String name;
@Column(name = "LINKS", columnDefinition = "jsonb null")
@Convert(converter = JsonbConverter.class)
private List<String> linkIds;
}
在使用标准生成器将上述查询转换为规范时,我需要帮助。
解决方案
使用 Jpa 规范检查 jsonb 数组是否包含 String 的一种方法是使用函数jsonb_contains
and jsonb_build_array
,后者用于将 String 更改为 jsonb 数组以用于jsonb_contains
.
public static Specification<TempTbl> linkInLinks(String linkId) {
return (root, query, builder) -> {
Expression toJsonbArray = builder.function("jsonb_build_array", String.class, builder.literal(linkId));
return builder.equal(builder.function("jsonb_contains", String.class, root.get("linkIds"), toJsonbArray), true);
};
}
推荐阅读
- tensorflow - 关于 Tensorflow 2.0 掩码的说明
- twilio - 使用 Twilio Studio Rest API V2
- typescript - 打字稿:模块 X 没有导出的成员 Y
- shell - 更新现有存档文件
- c++ - 优化稀疏下三角线性系统的反向求解
- php - 从另一个实现一个功能
- c# - 主应用程序中的 ASP.NET Core 3.1 主机子应用程序
- javascript - 两列中的谷歌应用脚本搜索将匹配的行作为二维数组
- c# - WinForm 按钮在 1-2 次使用后停止工作
- r - The length of trainPred is not correct in prediction function with R