postgresql 本机查询不替换参数,是否有此本机查询的JPQL版本

nzkunb0c  于 12个月前  发布在  PostgreSQL
关注(0)|答案(2)|浏览(158)

我在Postgres表order_information_table中有一个JSONB列order_information,数据如下:

{
    "response_list": [
        {
            "interest": 5,
            "number": "12221",
            "amount": 1200
        },
        {
            "interest": 1,
            "number": "12229",
            "amount": 800
        },
        {
            "interest": 2,
            "number": "12227",
            "amount": 2500
        }
    ]
}

字符串
我希望能够通过搜索JSONB列值的number字段来获取数据库记录。
当我使用一个带有硬编码数字值的原生查询时,我看到了结果:

@Query("select * from order_information_table " +
  "where order_information -> 'response_list' @> '[{\"number\": \"12221\"}]'",
  nativeQuery = true)
fun retrieveOrdersForNumber(
  @Param("number") number: String
): List<OrderInformation>


但是当我尝试使用参数时,它不起作用:

@Query("select * from order_information_table " +
  "where order_information -> 'response_list' @> '[{\"number\": \":number\"}]'",
  nativeQuery = true)
fun retrieveOrdersForNumber(
  @Param("number") number: String
): List<OrderInformation>


为什么参数:number没有被替换为值?
有没有可能使用JPQL查询而不是使用本机查询?

piv4azn7

piv4azn71#

既然number是第一个参数,为什么不将'[{\"number\": \":number\"}]'改为'[{\"number\": ?1}]'
参见此处:https://www.baeldung.com/spring-data-jpa-query#2-native-2

已编辑

经过更多的阅读,我认为错误是json部分被引用。
既然你使用的是原生查询,也许你应该尝试使用JSON创建函数

@Query("select * from order_information_table " +
  "where order_information -> 'response_list' @> jsonb_build_array(jsonb_build_object('number', :number))",
  nativeQuery = true)

字符串
在psql中运行下面的json函数,得到如下结果:

SELECT jsonb_build_array(jsonb_build_object('number', '12221'));
    jsonb_build_array    
------------------------
 [{"number" : "12221"}]

ecbunoof

ecbunoof2#

感谢Laurent Schoelens,这是使用JSON创建函数的原生SQL查询:

select * from order_information_table
where order_information -> 'response_list' @> jsonb_build_array(jsonb_build_object('number', '12221'))

字符串
这个原生SQL查询可以在Spring Data中执行,如下所示:

@Query("select * from order_information_table where " +
    "order_information -> 'response_list' @> jsonb_build_array(jsonb_build_object('number', cast(:number as VARCHAR)))",
    nativeQuery = true)
  fun retrieveOrdersForNumber(
    @Param("number") number: String
  ): List< OrderInformation >


我认为这个查询不可能有JPQL查询。

相关问题