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'
应该可以。
我正在尝试为使用 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'
应该可以。