原生查询 JPA - 不替换参数

3

我在PostgreSQL中有一个text[]列类型。

我正在尝试做这件事。

public interface MyUserRepo extends CrudRepository<MyUser, String> {

   @Query(value = "SELECT * FROM my_user x WHERE x.tenant_ids @> ARRAY[':tenantId'] AND x.roles @> ARRAY['driver']", nativeQuery = true)
    Set<MyUser> findDrivers(String tenantId);

}


我的问题是参数没有被替换。我猜测这是因为单引号的原因。
我尝试使用@Param("tenant_id"),但没有起作用。
还尝试使用索引参数,例如?1

1
有人遇到了同样的问题:https://dev59.com/nFEG5IYBdhLWcg3wb9gL - undefined
你试过不用单引号吗? - undefined
尝试注入参数,但查询失败。Caused by: org.postgresql.util.PSQLException: ERROR: operator does not exist: text[] @> character varying[] Hint: No operator matches the given name and argument type(s). You might need to add explicit type casts. - undefined
1个回答

0
在你的查询中,你在本地SQL查询中使用了一个命名参数":tenantId"。然而,在尝试在数组文字中引用它时,你使用了单引号将参数括起来,这导致了问题。此外,@Param注解中的参数名称应该与查询中的参数名称相匹配。
为解决这个问题,你应该在数组文字中删除参数周围的单引号,并确保@Param注解中的参数名称与查询中的参数名称匹配。
以下是代码的更新版本:
public interface MyUserRepo extends CrudRepository<MyUser, String> {

   @Query(value = "SELECT * FROM my_user x WHERE x.tenant_ids @> ARRAY[:tenantId] AND x.roles @> ARRAY['driver']", nativeQuery = true)
   Set<MyUser> findDrivers(@Param("tenantId") String tenantId);

}

是的。会进行注入,但查询不起作用。 由 org.postgresql.util.PSQLException 引起:错误:运算符不存在:text[] @> character varying[] 提示:没有与给定名称和参数类型匹配的运算符。您可能需要添加显式类型转换。 - undefined
也许你应该对数组进行显式转换:@Query(value = "SELECT * FROM my_user x WHERE x.tenant_ids @> ARRAY[:tenantId]::text[] AND x.roles @> ARRAY['driver']", nativeQuery = true) - undefined
1
谢谢:casting起了魔力。你的语法是错的,但是: @Query(value = "SELECT * FROM my_user t WHERE t.tenant_ids @> CAST(?1 AS text[])" ,nativeQuery = true) (详细租户ID需要放在花括号之间) - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接