例如,我有一本书JpaRepository。 Book有一个名为Name
的字段,book存储库有一个方法findOneByName
(作为jpa存储库方法命名约定)。但我需要两个不同版本的findOneByName
才能在不同的用例中使用。一个版本是 锁定注释 ,另一个版本是 无锁 。像这样:
public interface BookRepository extends JpaRepository<BookDAO, Long> {
@Lock(LockModeType.READ)
BookDAO findOneByName( String name );
BookDAO findOneByName( String name );
}
有可能在Spring实现吗?如果是这样,在调用它们时如何区分这两种方法。如果没有,是否还有其他方法可以在使用Spring JPA存储库接口(如findOneBy ***)时执行此操作。
答案 0 :(得分:3)
根据reference,我们可以使用以下前缀命名查询方法:find…By
,read…By
,query…By
,count…By
和get…By
。
所以方法BookDAO findByName(String name)
和BookDAO getByName(String name)
会做同样的事情。
答案 1 :(得分:1)
我不知道是否可以按照你的方式完成。但我会创建不同的方法
public interface BookRepository extends JpaRepository<BookDAO, Long> {
@Lock(LockModeType.READ)
@Query("select b from Book b where b.name = :name")
BookDAO findOneByNameForRead( String name );
BookDAO findOneByName( String name );
}
或者您可以在服务层中创建方法,而不是使用spring jparepository来处理锁定。并在需要更新的地方使用它,并将所有读取方法标记为@Transactional(readOnly = true)
@PersistenceContext
private EntityManager em;
...
public Book findOneBookForUpdate(String id) {
Book book = em.find(Book.class, id);
if (book != null) {
em.lock(book, LockModeType.PESSIMISTIC_WRITE);
}
return book;
}