Spring Data JPA - 使用标记列的repository findAll方法

17

我想在一个仓库中使用findAll方法,但我希望它只返回具有特定值的实体。例如,我希望它只返回active = 1的实体。有没有办法做到这一点?

现在我必须为所有我的仓库编写类似以下的代码:

@Query("select p from Parameter p where p.active = 1")
public List<Parameter> findAll();

我必须在所有仓库中写这段代码,而不是使用findOne方法:

@Query("select p from Parameter p where p.active = 1 and p.id=?1")
public Parameter findById(Long id);

有没有更好的方法来对所有查询应用一个全局过滤器?


也许可以看看 Hibernate 过滤器。 - jervine10
@jervine10 使用Hibernate过滤器确实是一个很好的想法。 - elvisdorow
我认为在spring-data-jpa文档中找到了一个好的、优雅的解决方案。它是使用SpEL表达式#{#entityName},创建一个通用的仓库,然后扩展这个接口以适用于我的具体实体仓库。 - elvisdorow
1个回答

25
如果您考虑从findAll转换到其他策略,请查看此处的文档 http://docs.spring.io/spring-data/jpa/docs/1.5.1.RELEASE/reference/html/jpa.repositories.html#jpa.sample-app.finders.strategies

JPA模块支持手动定义查询字符串或者从方法名中派生出查询。

所以在您的情况下,如果想要检索所有active = 1 的实体,可以编写类似如下的内容:

public List<Parameter> findByActive(Integer active);

你也可以按照这种方式来组合方法名:

public Parameter findByIdAndActive(Long id, Integer active);

方法签名与要执行的查询之间的翻译是自动的。

编辑:如果您在使用布尔类型表示活动状态,您也可以使用以下方法:

public List<Parameter> findByActiveTrue();
//or
public List<Parameter> findByActiveFalse();


->



如果您使用 public Parameter findByActive(Integer active),那么这会查找第一行中 active 值等于参数的值吗? 如果不是这样,那么该如何实现呢? - Aleksandar
@Fabio Maffioletti,按照特定列排序的结果怎么样? - Adly
@Adly:你需要将 OrderBy 添加到方法名中。例如:findByActiveOrderByName,其中“Name”是您要排序的对象的大写属性。 - Fabio Maffioletti
@FabioMaffioletti 救星 :) - R9J

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接