为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

森栏 2023-09-13 18:03:11
我正在尝试使用 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在我的情况下不匹配,因为我的参数锁定超时不是静态的。有谁知道如何动态设置参数锁定超时?
查看完整描述

1 回答

?
慕哥9229398

TA贡献1877条经验 获得超6个赞

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'应该可以。


查看完整回答
反对 回复 2023-09-13
  • 1 回答
  • 0 关注
  • 50 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信