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

Posted

技术标签:

【中文标题】在 spring-data-jpa 中通过布尔属性查询而不使用方法参数【英文标题】:Query by Boolean properties in spring-data-jpa without using method parameters 【发布时间】:2013-07-10 03:53:57 【问题描述】:

是否可以不使用方法参数在 Spring Data JPA 中通过布尔属性进行查询?

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

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

【问题讨论】:

【参考方案1】:

JPA repository section查询创建有以下方法。

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

我的猜测是使用

@Query
public Iterable<Entity> findByEnabledTrue();

【讨论】:

谢谢@orangegoat,但你确定它有效吗?它是在后来的一些 Spring Data 版本中引入的吗?我正在使用 1.0.1 并且遇到异常:Error creation bean with name 'entityRepository': FactoryBean throw exception on object creation;嵌套异常是 java.lang.IllegalArgumentException: No property true found for type boolean 嗯,在1.1.0.RC1版本(2012-02-03)中已经引入:“支持True/False作为查询关键字(DATAJPA-132)”。标记为已接受,即使我无法测试它是否有效。 我认为如果你将它作为真/假存储在数据库中,它会起作用。如果您将其存储为“Y”/“N”,则此选项将产生 x=1 并且在将字符串与 int 进行比较时将失败。我不得不以这种方式使用它:findByX(boolean enabled) 来获得正确的查询。不知道为什么在第一种情况下翻译没有按预期发生..【参考方案2】:

@Query 注释甚至可以被跳过。所以它应该像这样工作:

public Iterable<Entity> findByEnabledTrue();

【讨论】:

跳过@Query?不是真的,只检索特定字段怎么样?使用您的代码,您正在从数据库中检索实体的所有字段,这可能不是您想要的,话虽如此,我添加了您方法的另一个版本: public Iterable findByEnabledIsTrue();注意 Is 或 public Iterable findByEnabled(boolean done);然后传递一个布尔值作为参数 您确实可以跳过 @Query 注释,因为 Spring 只会根据约定仅根据方法名称推断出这一点,但是当然,如​​果您只需要特定字段,则可能需要构建查询我看不出它的附加值是什么,然后在你的方法 findByEnabled 中,这又不是这个问题的重点,正如这个问题的标题中明确指出的那样:'Query by Boolean properties in spring-data-jpa不使用方法参数' 是的,我知道他在不使用 @Query 的情况下要求解决方案,但您说要跳过 Query 注释我只是想确保人们阅读您的答案他们注意到这样做的后果,查询方法可能是如果您的实体具有许多字段或/和占用大量内存的字段(例如大字符串),则很危险。所以不,你不能就这样跳过

以上是关于在 spring-data-jpa 中通过布尔属性查询而不使用方法参数的主要内容,如果未能解决你的问题,请参考以下文章

在 mongoDB 中通过属性构建进行分组

如何在 TypeScript 中通过索引访问通用对象的属性?

如何在 Realm 中通过 NSDate 属性正确查询对象?

如何在 Mule 4 中通过 ActiveMQ 传递属性

使用AngularJS方式在对象数组中通过其属性查找对象

在 Rails 中通过 has_many 添加附加属性