2016-11-30 30 views
0

這裏是通用的問題:我想以某種方式獲得一個JpaRepository實例,它不會提供表中的所有數據,而是一個自定義的過濾數據集。換句話說,如果我能夠以某種方式將特定的AND條件附加到特定JpaRepository的每個查詢方法上,也可以實現相同的效果。參數化JpaRepository(或「subrepository」)

讓我們來看一個例子,希望它有助於理解我的問題:

心靈DB與圖書和用戶表。每個圖書實體都有一些屬性,如標題,說明,pageCount,作者和所有者,它是@ManyToOne(所有者有很多書籍)。即,書籍表數據在邏輯上被所有者分成大組。在我的代碼中,我使用findByName(String), findByAuthor(String)之類的查詢方法創建了界面BookRepository,但我希望通過某個用戶(所有者)始終區分已返回的圖書。然後我需要修改我的方法到findByNameAndOwner(String,User), findByAuthorAndOwner(String,User)等等。這很醜陋,而且我覺得我錯過了一些很好的Spring Data或JPA功能。

是否有某種方式有一些倉庫工廠,如:

User someOwner = ...; 
BookRepository repo = BookByOwnerRepositoryFactory.getRepositoryFor(someOwner); 

其中BookRepository仍然是這樣的:

interface BookRepository extends JpaRepository<Book,Long> 
{ 
    List<Book> findByName(String name); 
    List<Book> findByAuthor(String author); 
    ... 
} 

使用:

List<Book> javaBooks = repo.findByName("Effective Java"); 

javaBooks將包含書籍僅由someOwner擁有,並得到有效回覆這樣的查詢的SULT:

select b from Book b where b.name='Effective Java' and b.owner_id=42

其中42是someOwner.id。如您所見,最後一部分and b.owner_id=42應在內部附加到爲查詢方法BookRepository生成的每個查詢。

+0

我認爲這種方法是Spring Data JPA意味着使用的方式。您隱藏了可能查看代碼的人的一半信息,這樣做不好。更重要的是,這意味着每次調用服務時都會創建一個新的實例,當您將它們保存爲單例時,會增加大量不必要的開銷。 – Vaelyr

回答

0

你可以嘗試使用Querydsl或規範,比如here

在庫中,您將有方法的findAll其作爲參數具備的條件。