MyBatis 解析具有多个语句的参数

我正在尝试使用 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在我的情况下不匹配,因为我的参数锁定超时不是静态的。


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


森栏
浏览 83回答 1
1回答

慕哥9229398

pgjdbc 似乎独立执行每个语句。我不建议将多个语句放入单个映射器语句中,因为行为取决于驱动程序。您应该声明两个方法并在同一会话/事务中调用它们。@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不适用于 a PreparedStatement。@Update用于立即应用更改。如果您使用@Select,您可能需要SqlSession#commit()显式调用。与您的示例不同,该参数必须包含sie setLockTimeout("1s")。如果您只想传递一个数字,#{lockTimeout} || 's'应该可以。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java