這裏是通用的問題:我想以某種方式獲得一個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
生成的每個查詢。
我認爲這種方法是Spring Data JPA意味着使用的方式。您隱藏了可能查看代碼的人的一半信息,這樣做不好。更重要的是,這意味着每次調用服務時都會創建一個新的實例,當您將它們保存爲單例時,會增加大量不必要的開銷。 – Vaelyr