我目前正在寻找异常的解决方案
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"}'
以上都不适用于我,除了以下,
服务层代码: -
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);
这就是我实现结果的方式。我希望这对所有热心人士都非常有帮助!!
感谢大家的帮助 !!!
尝试绑定参数如下
@Query(nativeQuery = true, value = "SELECT * FROM thgcop_order_placement"
+ " WHERE \"order_info\" @> '{\"parentOrderNumber\":\" ?1 \"}'")
TL; DR:首先使用Bind Parameter和普通JDBC。然后转到Spring Data,可能会回到自定义实现上。
你在这里面临许多层面的问题。
SELECT * FROM thgcop_order_placement WHERE "order_info" @> '{"parentOrderNumber":"ORD123"}'
我们应该把它比作
SELECT * FROM thgcop_order_placement WHERE "order_info" @> '{"parentOrderNumber": ? }'
请注意,我们丢失了引号,因为它们表示文字字符串但我们不提供文字字符串而是提供绑定参数。SELECT * FROM thgcop_order_placement WHERE "order_info" @> ?
当然,bind参数应该包含完整的JSON表达式VARCHAR
而不是JSON表达式。见https://blog.2ndquadrant.com/processing-json/。我认为应该是正确的版本
SELECT * FROM thgcop_order_placement WHERE "order_info" @> ?::json
但我也无法让这个工作。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.