繁体   English   中英

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

[英]Spring data jpa - How to combine multiple And and Or through method name

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

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

MethodName - findByPlan_PlanTypeInAndSetupStepIsNullOrStepupStepIs(...)

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

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

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

同意奥利弗关于长且不可读的方法名,但是尽管如此,并且为了论证,您可以通过使用等效性来获得所需的结果

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

因此,在您的情况下,它应如下所示:

findByPlan_PlanTypeInAndSetupStepIsNullOrPlan_PlanTypeInAndStepupStepIs(...)

选项1:您可以使用命名查询(请参阅使用JPA命名查询 ):

@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编写您的自定义查询(请参阅使用@Query

public interface UserRepository extends JpaRepository<User, Long> {

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

当前是不可能的,将来也不会。 我认为即使有可能,对于更复杂的查询,您也不想人为地将所有查询复杂性压缩为方法名称。 不仅因为难以理解查询中实际发生的事情,而且还因为从客户端代码的角度出发:您想要使用可表达的方法名,如果使用简单的findByUsername(…) ,则可以使用查询派生创造。

对于更复杂的内容,您只是将查询复杂度提高到调用代码中,建议改为使用可读的方法名称,该名称以语义方式表达查询的作用,并使用@Query ,命名查询或类似。

使用类似

findByFirstElementAndCriteriaOrSecondElementAndCriteria

就像(第一&条件)或(第二&条件)->条件&(第一或第二)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM