hibernate How to ignore quotes for nested ARRAY in a PostgreSQL query in a Spring Data @Query

bis0qfac  于 2023-08-06  发布在  PostgreSQL
关注(0)|答案(2)|浏览(137)

这个问题可能看起来很愚蠢,但我坚持执行这种查询:

UPDATE user SET productArr = ARRAY[ARRAY[2,2],ARRAY[3,2],ARRAY[1,3]] WHERE id = 1;

字符串
@Query Spring Data中。
我定义了我的repository方法如下:

@Modifying
    @Query(value = """
            UPDATE user
            SET productArr = :productArr WHERE id = :userId
            """, nativeQuery = true)
    void updateProductArr (@Param("productArr") String productArr, @Param("userId") Long userId);


我设置String productArr="ARRAY[ARRAY[2,2],ARRAY[3,2],ARRAY[1,3]]"错误是:

org.postgresql.util.PSQLException: ERROR: column "productArr" is of type text[] but expression is of type text


我尝试将productArr的类型从String更改为String[]List<String>,但没有成功。
我也尝试了这个解决方案:UPDATE user SET productArr = REPLACE(:productArr,'"','') WHERE id = :userId但结果相同。
请注意,当我在数据库控制台上运行该查询时,它运行得很好。提前感谢您的帮助。

ocebsuys

ocebsuys1#

使用此查询更新数据时:

UPDATE user SET productArr = ARRAY[ARRAY[2,2],ARRAY[3,2],ARRAY[1,3]] WHERE id = 1;

字符串
Postgres会自动将整数数组转换为字符串数组,因为据我所知,productArr字段的类型为text[]
您可以使用以下正确的SQL查询过滤此字段:

select * from users
where productArr = ARRAY[ARRAY['2','2'],ARRAY['3','2'],ARRAY['1','3']]


或者是

select * from users
where productArr = '{{2,2},{3,2},{1,3}}'::text[]


在你的 Spring 项目中,你有两种方法可以做到这一点。
1.输入参数使用数组类型,不要使用字符串类型
1.您可以对输入参数使用字符串类型,但应该在本机查询中强制转换类型。
举例来说:

@Modifying
@Query(value = """
        UPDATE user
        SET productArr = (:productArr)::text[] WHERE id = :userId
        """, nativeQuery = true)
void updateProductArr (@Param("productArr") String productArr, @Param("userId") Long userId);


并用途:

String productArr = "{{2,2},{3,2},{1,3}}"

xfyts7mz

xfyts7mz2#

您的问题是由PostgreSQL数组类型和Spring Data查询的productArr参数之间的类型不匹配引起的。要解决这个问题,请将方法签名中productArr参数的类型修改为String[],并在查询中使用::text[]强制转换显式定义参数类型。这保证了更新查询的有效运行。

相关问题