如何通过方法名组合多个And和Or

问题描述 投票:0回答:5

我正在尝试迁移应用程序。我正在从 Hibernate 转向 Spring Data JPA。

虽然 Spring Data JPA 提供了简单的查询构建方法,但我仍然坚持创建同时使用

And
Or
运算符的查询方法。

方法名称 -

findByPlan_PlanTypeInAndSetupStepIsNullOrStepupStepIs(...)

当它转换为查询时,前两个表达式被组合并作为

[(exp1 and exp2) or (exp3)]
执行,而 required 为
](exp1) and (exp2 or exp3)]

任何人都可以告诉我这是否可以通过 Spring Data JPA 实现吗?

java spring-data-jpa spring-data
5个回答
60
投票

我同意奥利弗关于长且不可读的方法名称的观点,但是尽管如此,为了论证,您可以通过使用等价性来实现所需的结果

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

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

findByPlan_PlanTypeInAndSetupStepIsNullOrPlan_PlanTypeInAndStepupStepIs(...)

23
投票

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


对于更复杂的东西,您只需将查询复杂性提升到调用代码中,建议改为使用可读的方法名称,该名称在语义上表达查询的功能,并使用

findByUsername(…)

将查询复杂性保留在手动声明的查询中,命名为查询或类似问题。

    


18
投票

@Query

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


13
投票
选项1:

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

选项2

:使用@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); } 编写自定义查询(请参阅

使用@Query
@Query



0
投票

public interface UserRepository extends JpaRepository<User, Long> { @Query("select u from User u where u.emailAddress = ?1") User findByEmailAddress(String emailAddress); }

一个好的做法是将大查询分成几个部分,然后以这种方式使用它们:

Page<SystemEntity> findByNameContainsAndFlagIsFalseOrFamilyContainsAndFlagIsFalseOrEmailContainsAndFlagIsFalse(String name, String family ,String email, Pageable pageable);

这种方法允许您根据需要重用较小的方法进行其他查询,并使您的代码更加模块化和可维护。

© www.soinside.com 2019 - 2024. All rights reserved.