【问题标题】:MyBatis Resolving parameter with multiple statementsMyBatis Resolving 参数与多个语句
【发布时间】:2019-10-01 13:16:39
【问题描述】:

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

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

【问题讨论】:

    标签: java postgresql mybatis spring-mybatis


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-12
      • 2013-10-23
      相关资源
      最近更新 更多