MyBatis 多语句解析参数

MyBatis Resolving parameter with multiple statements

我正在尝试为使用 MyBatis 和 PostgreSQL 的查询动态设置锁定超时。

我的映射器看起来像:

 @Select("SET LOCAL lock_timeout = '#{lockTimeout}s';"
   + "SELECT ......where id= #{myId} FOR UPDATE")
 MyObject select(@Param("lockTimeout") String lockTimeout, @Param("myId") String id);

似乎参数不匹配,我收到

 org.postgresql.util.PSQLException: Index of column out of range : 2, number of column 1.

@SelectProvider 在我的情况下不匹配,因为我的参数锁定超时不是静态的。

有谁知道如何动态设置参数锁定超时?

pgjdbc 似乎独立执行每个语句。
我不建议将多个语句放在单个映射器语句中,因为行为取决于驱动程序。
您应该声明两个方法并在同一个 session/transaction 中调用它们。

@Update("select set_config('lock_timeout', #{lockTimeout}, true)")
void setLockTimeout(String lockTimeout);

@Select("SELECT ......where id= #{myId} FOR UPDATE")
MyObject select(@Param("myId") String id);

一些注意事项:

  • set_config() 用作 SET LOCAL 似乎不适用于 PreparedStatement
  • @Update 用于立即应用更改。如果您使用 @Select,您可能需要显式调用 SqlSession#commit()
  • 与您的示例不同,参数必须包含 s,即 setLockTimeout("1s")
    如果您更喜欢只传递一个数字,#{lockTimeout} || 's' 应该可以。