【问题标题】:How to change brackets for postgresql?如何更改 postgresql 的括号?
【发布时间】:2021-10-08 18:32:07
【问题描述】:

我想从此查询中检索数据。但如果 col 只有一个值,则此查询有效。如果有 2 个或更多值,则不起作用。

@Query(value="SELECT * FROM art where color @> ARRAY[:col]",
            nativeQuery=true)
    List<Recept> findBy( @Param("col") Set<Integer> col);

通过休眠,我看到了查询。这个很好用。

Hibernate: SELECT *   FROM  art  where color @> ARRAY[(?)]

虽然这不起作用。 错误:运算符不存在:整数[] @> 记录[]

Hibernate: SELECT *   FROM  art  where color @> ARRAY[(?, ?)]

我认为问题在括号中。

【问题讨论】:

  • 我之前在 PostGres 中从来没有写过这样的查询,但是如果你仔细看错误信息,它会认为 ARRAY[(?, ?)]record[]
  • 是的也注意到了,但不知道为什么会这样
  • 可能是因为它没想到你会给它record[]
  • 你想要array[?,?] - 表达式(?,?) 是一个匿名记录类型的单个值(有两个字段)
  • 正如我所写:ARRAY[(1, 2)]ARRAY[1, 2] 完全不同。第一个表达式是具有单个元素的数组,第二个表达式是具有两个整数的数组。只需去掉括号。

标签: java arrays spring postgresql


【解决方案1】:

你可以把代码改成这个

@Query(value="SELECT * FROM art where color in :col",
            nativeQuery=true)
    List<Recept> findBy( @Param("col") Set<Integer> col);

所以结果查询将是

SELECT *   FROM  art  where color in (1,2,3)

其中 (1,2,3) 是与 IN 运算符一起使用的 list of scalar values

TD;DR:

您的问题是您将作为第二个参数传递给 @&gt; 运算符的行列表而不是整数列表。正如 cmets 中的 horse_with_no_name 所述,您在尝试比较不同性质的事物时生成了错误的查询。

【讨论】:

【解决方案2】:

解决了。添加了带有过滤器的 plpgsql 函数

【讨论】:

    猜你喜欢
    • 2020-07-17
    • 2019-08-01
    • 2021-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多