我正在尝试迁移该应用程序。我正在从 Hibernate到Spring Data Jpa 工作。
尽管spring数据jpa提供了简单的查询构建方法,但我仍然坚持创建同时使用And
和Or operator
的查询方法。
MethodName - findByPlan_PlanTypeInAndSetupStepIsNullOrStepupStepIs(...)
当它转换为查询时,前两个表达式被合并,并作为[(exp1 and exp2) or (exp3)]
执行。
而必需的是](exp1) and (exp2 or exp3)]
。
有人可以通过Spring data jpa?
答案 0 :(得分:17)
与Oliver就长而不可读的方法名称达成一致,但是为了论证,你可以通过使用等价来达到预期的结果
A /\ (B \/ C) <=> (A /\ B) \/ (A /\ C)
A and (B or C) <=> (A and B) or (A and C)
所以在你的情况下它看起来应该是这样的:
findByPlan_PlanTypeInAndSetupStepIsNullOrPlan_PlanTypeInAndStepupStepIs(...)
答案 1 :(得分:6)
选项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);
}
答案 2 :(得分:6)
使用类似
的内容findByFirstElementAndCriteriaOrSecondElementAndCriteria
就像(第一和条件)或(第二和条件) - &gt;条件和(第一或第二)
答案 3 :(得分:5)
它目前无法实现,并且未来也不会成功。我认为,即使有可能,使用更复杂的查询,您也不会想要人为地将所有查询复杂性压缩到方法名称中。不仅因为它很难消化查询中实际发生的事情,而且从客户端代码的角度来看:你想要使用富有表现力的方法名称 - 如果是简单的findByUsername(…)
- 查询派生允许您创建。
对于更复杂的东西你&#39;只是将查询复杂性提升到调用代码中,建议转而使用语义上表达查询功能的可读方法名称,并使用@Query
命名查询将查询复杂性保留在手动声明的查询中等等。