2017-03-27 69 views
1

例如,我有一本書JpaRepository。 Book有一個名爲Name的字段,圖書庫有一個方法findOneByName(作爲jpa庫方法的命名約定)。但是我需要兩種不同版本的findOneByName以用於不同的使用情況。一個版本是鎖註釋,另一個是無鎖。像這樣:Spring數據JPA存儲庫方法重載

public interface BookRepository extends JpaRepository<BookDAO, Long> { 

    @Lock(LockModeType.READ) 
    BookDAO findOneByName(String name); 

    BookDAO findOneByName(String name); 
} 

在春天可以實現這個嗎?如果是這樣,那麼在調用它們時如何區分這兩種方法。如果沒有,是否還有另一種方法來繼續使用Spring JPA存儲庫接口(如findOneBy ***)。

+0

我只是不會使用其中的一個查詢方法。我會爲@Lock創建一個新方法,並將其命名爲'findOneByNameWithLock(name)'。然後使用@Query註釋併爲其指定查詢。 – LucasP

+0

不,不是這樣的(和Spring沒有任何關係,但Java是如何工作的)。 –

+0

@ M.Deinum謝謝。你對這個用例有一些建設性的建議嗎?如何以另一種方式做到這一點? –

回答

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(唯讀=真)方法

@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; 
} 
+0

它不會工作。第二種方法調用第一種方法,相當於直接調用第一種方法。 –

+0

你是對的,編輯我的答案 – surya

1

根據reference我們可以命名這些前綴查詢方法:find…Byread…Byquery…Bycount…Byget…By

所以方法BookDAO findByName(String name)BookDAO getByName(String name)將做同樣的事情。

相關問題