使用Postgres JSONB查询与Spring Data和绑定参数失败与InvalidDataAccessApiUsageException

问题描述 投票:0回答:3

我目前正在寻找异常的解决方案

org.springframework.dao.InvalidDataAccessApiUsageException: Parameter with that position [1] did not exist;

我目前的@Query注释是:

@Query(
    nativeQuery = true, 
    value = "SELECT * FROM thgcop_order_placement WHERE \"order_info\" @> '{\"parentOrderNumber\":\" :param \"}'")

我猜position [1] did not exist来自双引号加双引号加单引号。

我怎样才能做到这一点?

该查询使用Postgres JSONB数据类型。列定义是ORDER_INFO JSONB

以下本机查询在Postgres客户端中运行正常:

SELECT * FROM thgcop_order_placement
WHERE "order_info" @> '{"parentOrderNumber":"ORD123"}'
spring postgresql hibernate spring-data-jpa jsonb
3个回答
5
投票

以上都不适用于我,除了以下,

服务层代码: -

OrderInfo orderInfo = new OrderInfo();
orderInfo.setParentOrderNumber("ORD123");
....
String param = objectMapper.writeValueAsString(orderInfo);
List<Order> list = jpaRepository.getByParentOrderNumber(param);

JpaRepository.java代码: -

@Query(nativeQuery = true, value = "select * from thgcop_order_placement where order_info @> CAST(:condition as jsonb)")
List<Order> getByParentOrderNumber(@Param("condition") String parentOrderNumber);

这就是我实现结果的方式。我希望这对所有热心人士都非常有帮助!!

感谢大家的帮助 !!!


0
投票

尝试绑定参数如下

@Query(nativeQuery = true, value = "SELECT * FROM thgcop_order_placement"
  + " WHERE \"order_info\" @> '{\"parentOrderNumber\":\" ?1 \"}'")

0
投票

TL; DR:首先使用Bind Parameter和普通JDBC。然后转到Spring Data,可能会回到自定义实现上。

你在这里面临许多层面的问题。

  1. 我们现在开始忽略Spring Data。您显示的语句与您尝试使用Spring Data构建的语句非常不同,因为它不包含绑定变量。而不是 SELECT * FROM thgcop_order_placement WHERE "order_info" @> '{"parentOrderNumber":"ORD123"}' 我们应该把它比作 SELECT * FROM thgcop_order_placement WHERE "order_info" @> '{"parentOrderNumber": ? }' 请注意,我们丢失了引号,因为它们表示文字字符串但我们不提供文字字符串而是提供绑定参数。
  2. 我没有发现任何迹象表明你可以在JSON表达式的部分中使用绑定参数。因此,除了上面的陈述,我们还需要使用: SELECT * FROM thgcop_order_placement WHERE "order_info" @> ? 当然,bind参数应该包含完整的JSON表达式
  3. 不幸的是,这似乎不起作用,因为现在Postgres认为绑定参数是VARCHAR而不是JSON表达式。见https://blog.2ndquadrant.com/processing-json/。我认为应该是正确的版本 SELECT * FROM thgcop_order_placement WHERE "order_info" @> ?::json 但我也无法让这个工作。
  4. 无论如何,您只需将参数转换为JSON结构即可。通常我建议使用SpEL表达式。但是它不起作用,因为Spring Data在SpEL表达式中需要花括号并将它们视为SpEL表达式的结尾。
  5. 如果你得到这样的东西来使用简单的JDBC连接或JdbcTemplate,你就可以开始考虑@Query注释了。 @Query( value= "SELECT * FROM thgcop_order_placement WHERE \"order_info @> :name::json", nativeQuery = true)

这可能会引发更多问题,因为Spring Data会将::json视为参数名称的一部分。如果是这种情况,您将不得不依赖自定义实现。

I ran a couple of experiments, which you can look at and play with here.

© www.soinside.com 2019 - 2024. All rights reserved.