簡體   English   中英

MyBatis Resolving 參數與多個語句

[英]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在我的情況下不匹配,因為我的參數鎖定超時不是 static。

有誰知道如何動態設置參數鎖定超時?

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()
  • 與您的示例不同,參數必須包括setLockTimeout("1s") s
    如果你更喜歡只傳遞一個數字, #{lockTimeout} || 's' #{lockTimeout} || 's'應該工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM