我的以下原生查询无效:
Query createNativeQuery = entityManager.createNativeQuery(
"select id from cscache where id=? for update ");
环境详情:
错误:
2014-12-12 10:20:14,581 WARN [org.hibernate.util.JDBCExceptionReporter]
SQL错误:1064,SQLState:42000(http-0.0.0.0-8543-3:)
2014-12-12 10:20:14,581 ERROR [org.hibernate.util.JDBCExceptionReporter] 您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以便在第1行的“限制2”附近使用正确的语法(http-0.0.0.0-8543-3:)
答案 0 :(得分:1)
对于Update,基本上会锁定行,要使用JPA实现相同的操作,您需要使用Lock Modes。要设置锁定,可以使用EntityManager或TypeQuery并使用LockModeType.PESSIMISTIC_WRITE。
答案 1 :(得分:0)
具体不熟悉JPA,但您似乎并没有告诉它?
的价值是什么。查看setParameter。
答案 2 :(得分:0)
我实际上还没有在hibernate中进行更新,但我相信你可以(而且应该)在Session或查询对象上进行更新。为什么不让hibernate执行它而不是执行本机查询? 根据锁定文档(Chapter 5: Locking,您可以在会话或查询中设置锁定模式。
Cscache cscache = (Cscache )session.get( Cscache.class, id, LockOptions.UPGRADE );
指定LockOptions应该导致执行SELECT ... FOR UPDATE。