Parametric JpaRepository(或" subrepository")

时间:2016-11-30 07:30:52

标签: java spring spring-data-jpa jpql

这里是一般性问题:我想以某种方式得到一个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的查询方法生成的每个查询中。

1 个答案:

答案 0 :(得分:0)

您可以尝试使用Querydsl或here

等规范

在存储库中,您将使用方法findAll作为参数具有条件。