这里是一般性问题:我想以某种方式得到一个JpaRepository实例,它不会提供来自表的所有数据,而是提供自定义过滤的数据集。换句话说,如果我能够以某种方式将自定义AND条件附加到特定JpaRepository的每个查询方法,则可以实现相同的效果。
让我们看一个例子,希望它有助于理解我的问题:
使用Book和User表记住DB。每个图书实体都有一些属性,如标题,描述,pageCount,作者和所有者,这是@ManyToOne(所有者有很多书)。即,Book表数据由所有者在逻辑上分成大组。在我的代码中,我使用BookRepository
之类的查询方法创建了界面findByName(String), findByAuthor(String)
,但我希望始终通过我当前服务的某个用户(所有者)来区分返回的书籍。然后我需要将我的方法修改为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
所拥有的图书,并且实际上是此类查询的结果:
select b from Book b where b.name='Effective Java' and b.owner_id=42
其中42是someOwner.id
。如您所见,最后一部分and b.owner_id=42
应内部附加到为BookRepository
的查询方法生成的每个查询中。