Spring Data JPA存储库方法重载

时间:2017-03-27 12:55:50

标签: spring hibernate orm spring-data-jpa

例如,我有一本书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 ***)时执行此操作。

2 个答案:

答案 0 :(得分:3)

根据reference,我们可以使用以下前缀命名查询方法:find…Byread…Byquery…Bycount…Byget…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;
}