gpt4 book ai didi

spring - 如何使用 spring data jpa 查询 jsonb 列?

转载 作者:行者123 更新时间:2023-11-29 11:30:24 29 4
gpt4 key购买 nike

我在针对 postgres 9.4 实例获取此 native 查询时遇到问题。

我的仓库有一个方法:

 @Query(value = "SELECT t.* " +
"FROM my_table t " +
"WHERE t.field_1 = ?1 " +
"AND t.field_2 = 1 " +
"AND t.field_3 IN ?2 " +
"AND t.jsonb_field #>> '{key,subkey}' = ?3",
nativeQuery = true)
List<Entity> getEntities(String field1Value,
Collection<Integer> field3Values,
String jsonbFieldValue);

但是日志显示:

SELECT t.* FROM my_table t 
WHERE t.field_1 = ?1
AND t.field_2 = 1
AND t.field_3 IN ?2
AND t.jsonb_field ? '{key,subkey}' = ?3

我得到这个异常:

Internal Exception: org.postgresql.util.PSQLException: No value specified for parameter 2.

我在方法调用之前直接记录了参数,它们都已提供。

我不确定为什么 #>> 在日志中显示 ?。我需要转义 #>> 吗?我需要为 IN 格式化集合吗?我需要转义 json 路径吗?

当我直接对数据库执行查询时,它起作用了。示例:

SELECT *
FROM my_table t
WHERE t.field_1 = 'xxxx'
AND t.field_2 = 1
AND t.field_3 IN (13)
AND t.jsonb_field #>> '{key,subkey}' = 'value'

最佳答案

我发现 Specification 非常有帮助来自 spring 数据的 api。
假设我们有一个名为 Product 的实体和一个名为 title 的 JSON(B) 类型的属性。
我假设此属性包含不同语言的产品标题。例如:{"EN":"Multicolor LED light", "EL":"Πολύχρωμο LED φώς"}
下面的源代码通过作为参数传递的标题和区域设置找到一个(或更多,如果它不是唯一字段)产品。

@Repository
public interface ProductRepository extends JpaRepository<Product, Integer>, JpaSpecificationExecutor<Product> {
}


public class ProductSpecification implements Specification<Product> {

private String locale;
private String titleToSearch;

public ProductSpecification(String locale, String titleToSearch) {
this.locale = locale;
this.titleToSearch = titleToSearch;
}

@Override
public Predicate toPredicate(Root<Product> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
return builder.equal(builder.function("jsonb_extract_path_text", String.class, root.<String>get("title"), builder.literal(this.locale)), this.titleToSearch);
}
}


@Service
public class ProductService {

@Autowired
private ProductRepository productRepository;

public List<Product> findByTitle(String locale, String titleToSearch) {
ProductSpecification cs = new ProductSpecification(locale, titleToSearch);
return productRepository.find(cs);
// Or using lambda expression - without the need of ProductSpecification class.
// return productRepository.find((Root<ProductCategory> root, CriteriaQuery<?> query, CriteriaBuilder builder) -> {
// return builder.equal(builder.function("jsonb_extract_path_text", String.class, root.<String>get("title"), builder.literal(locale)), titleToSearch);
// });
}
}

您可以找到关于应该如何使用 Spring Data 的另一个答案 here .
希望对您有所帮助。

关于spring - 如何使用 spring data jpa 查询 jsonb 列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43900457/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com