【发布时间】:2018-02-22 19:46:43
【问题描述】:
我想使用 Spring Data JPA 在 Oracle 上执行 SKIP LOCKED 查询,所以我尝试了以下方法:
@Lock(LockModeType.PESSIMISTIC_WRITE)
@Query(value = "SELECT * FROM User WHERE ID=?1 FOR UPDATE SKIP LOCKED", nativeQuery = true)
User findOne(UUID id);
我尝试了上面的,发现生成的查询包含FOR UPDATE,但不包含SKIP LOCKED(下面是从日志中生成的查询):
select ent0_.column1 as name, ent0_.CREATED_DATE as CREATED_2_33_0_ from TABLE_NAME alias_name where ent0_.column1=? for update
如果我从查询方法中删除@Lock,生成的查询甚至没有FOR UPDATE。
请根据需要建议我如何使用FOR UPDATE SKIP LOCKED 生成查询。
【问题讨论】:
-
如您所见,
FOR UPDATE是由@Lock(LockModeType.PESSIMISTIC_WRITE)添加的,而不是您的本机查询。由于 JPA 是一个与数据库无关的规范,不幸的是,这只是 JPA 所能达到的范围,因为SKIP LOCKED是 Oracle 特定的特性。如果您必须使用特定于数据库的功能,则必须编写一个自定义存储库实现,直接通过EntityManager执行原始 SQL。
标签: spring hibernate jpa spring-data-jpa