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 提供了简单的查询构建方法,但我坚持创建同时使用 And
和 Or 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)
【讨论】:
它会起作用,但它最大的缺点是您必须将相同的标准作为参数传递多次,因为您在查询中使用它们。在这种情况下,您必须传递两个包含相同内容的变量Criteria
:findByFirstElementAndCriteriaOrSecondElementAndCriteria(Element element1, Criteria criteria1, Element element2, Criteria criteria2) //criteria1.equals(criteria2) -> 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的主要内容,如果未能解决你的问题,请参考以下文章