在spring-data-jpa中,如何通过布尔属性进行查询而不使用方法参数

87

在不使用方法参数的情况下,是否有可能在Spring Data JPA中通过布尔属性进行查询?

基本上,我希望这可以在不使用自定义@Query注释的情况下工作:

@Query("SELECT c FROM Entity c WHERE c.enabled = true")
public Iterable<Entity> findAllEnabled();
2个回答

199

JPA 存储库章节的查询创建具有以下方法。查看

True    findByActiveTrue()  … where x.active = true
False   findByActiveFalse() … where x.active = false

我猜应该使用

@Query
public Iterable<Entity> findByEnabledTrue();

谢谢,@orangegoat,但你确定这个方法有效吗?它是在哪个Spring Data版本中引入的呢?我使用的是1.0.1版本,但我遇到了一个异常:Error creating bean with name 'entityRepository': FactoryBean threw exception on object creation; nested exception is java.lang.IllegalArgumentException: No property true found for type boolean. - Mike Minicki
好的,它已经在1.1.0.RC1版本(2012-02-03)中引入了:“支持True/False作为查询关键字(DATAJPA-132)”。尽管我无法测试其是否有效,但仍将其标记为已接受。 - Mike Minicki
我认为如果你将它存储在数据库中作为true/false,那么它会起作用。如果你将它存储为'Y'/'N',这个查询将产生where x=1,并且在将字符串与整数进行比较时会失败。我不得不这样使用:findByX(boolean enabled)来获取正确的查询。不确定为什么第一种情况下翻译没有按预期进行... - Vadim Kirilchuk

38

甚至可以省略@Query注释,这样它应该像这样正常工作:

public Iterable<Entity> findByEnabledTrue();

跳过@Query?不一定,那么如何仅检索特定字段呢?使用您的代码,您正在从数据库中检索实体的所有字段,这可能不是您想要的。因此,我添加了另一个版本的方法:public Iterable<Entity> findByEnabledIsTrue(); 或者 public Iterable<Entity> findByEnabled(boolean done); 然后将布尔值作为参数传递。 - Melardev
1
您确实可以跳过@Query注释,因为Spring将仅根据方法名称的约定推断出它,但是如果您只想要特定字段,则可能需要构建查询,但我不知道其中的附加值,而且就您的findByEnabled方法而言,这并不是这个问题的重点,因为在这个问题的标题中已经明确说明了:“在spring-data-jpa中通过布尔属性进行查询而不使用方法参数”。 - megalucio
是的,我知道他要求不使用@Query的解决方案,但你提到了跳过Query注释,我只是想确保阅读你的答案的人们注意到这一后果,如果你有一个具有许多字段或/和占用大量内存的字段(例如大字符串)的实体,则查询方法可能是危险的。因此,不,你不能就这样跳过它。 - Melardev

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