Spring data jpa - 如何通过方法名称组合多个And和Or

Posted

技术标签:

【中文标题】Spring data jpa - 如何通过方法名称组合多个And和Or【英文标题】:Spring data jpa - How to combine multiple And and Or through method name 【发布时间】:2016-06-17 18:19:33 【问题描述】:

我正在尝试迁移应用程序。我正在从 Hibernate 到 Spring Data Jpa 工作。

虽然 spring data jpa 提供了简单的查询构建方法,但我坚持创建同时使用 AndOr operator 的查询方法。

方法名 - findByPlan_PlanTypeInAndSetupStepIsNullOrStepupStepIs(...)

当它转换为查询时,前两个表达式被组合起来,它作为[(exp1 and exp2) or (exp3)] 执行。

而需要的是](exp1) and (exp2 or exp3)]

谁能告诉我这是否可以通过Spring data jpa?实现

【问题讨论】:

【参考方案1】:

同意 Oliver 关于长且不可读的方法名称,但是为了论证,您可以通过使用等效性来达到预期的结果

A /\ (B \/ C) <=> (A /\ B) \/ (A /\ C)
A and (B or C) <=> (A and B) or (A and C)

所以在你的情况下它应该看起来像这样:

findByPlan_PlanTypeInAndSetupStepIsNullOrPlan_PlanTypeInAndStepupStepIs(...)

【讨论】:

这基本上奏效了 - 但是:如何使用 with 方法避免重复变量? (如果可能的话....) 是的,这行得通...看起来您无法避免重复的参数。我使用门面方法来隐藏笨拙的方法签名 是的,这行得通。充分利用原则。【参考方案2】:

目前不可能,将来也不会。我认为即使有可能,对于更复杂的查询,您也不希望人为地将所有查询复杂性压缩到方法名称中。不仅因为很难消化查询中实际发生的事情,而且从客户端代码的角度来看:您想使用表达性的方法名称,在简单的findByUsername(…) 的情况下,查询派生允许您创建。

对于更复杂的内容,您只需将查询复杂性提升到调用代码中,建议改为使用可读的方法名称,该名称在语义上表达查询的功能,并将查询复杂性保留在手动声明的查询中,或者使用 @Query 、命名查询等。

【讨论】:

【参考方案3】:

使用类似的东西

findByFirstElementAndCriteriaOrSecondElementAndCriteria

就像 (first & condition) OR (second & condition) --> condition & (first or second)

【讨论】:

它会起作用,但它最大的缺点是您必须将相同的标准作为参数传递多次,因为您在查询中使用它们。在这种情况下,您必须传递两个包含相同内容的变量 CriteriafindByFirstElementAndCriteriaOrSecondElementAndCriteria(Element element1, Criteria criteria1, Element element2, Criteria criteria2) //criteria1.equals(criteria2) -&gt; true 【参考方案4】:

选项1:您可以使用命名查询(参见Using JPA Named Queries):

@Entity
@NamedQuery(name = "User.findByEmailAddress",
  query = "select u from User u where u.emailAddress = ?1")
public class User 



public interface UserRepository extends JpaRepository<User, Long> 

   User findByEmailAddress(String emailAddress);

选项2:使用@Query 编写您的自定义查询(参见Using @Query)

public interface UserRepository extends JpaRepository<User, Long> 

   @Query("select u from User u where u.emailAddress = ?1")
   User findByEmailAddress(String emailAddress);

【讨论】:

感谢您的回复!使用 NamedQuery 或 Query 的唯一缺点是,当同一个 repo 类中有多个连接查询时,它会使类看起来很混乱:( 但是话又说回来,你的方法名称会不会开始显得凌乱而难以阅读?从方法名派生的查询对于简单的查询很方便——在某些时候你应该切换到@Query或类似的。

以上是关于Spring data jpa - 如何通过方法名称组合多个And和Or的主要内容,如果未能解决你的问题,请参考以下文章

spring-data-jpa中的查询方法

spring-data-jpa

Spring Data JPA05 方法名限定查询

spring data jpa 创建方法名进行简单查询

spring data jpa在使用PostgreSQL表名大小写的问题解决

如何通过 Spring Data JPA 了解底层数据库名称