Spring数据jpa - 如何通过方法名称

时间:2016-03-04 05:46:59

标签: spring-data-jpa

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

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

MethodName - findByPlan_PlanTypeInAndSetupStepIsNullOrStepupStepIs(...)

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

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

有人可以通过Spring data jpa?

告诉我这是否可以实现

4 个答案:

答案 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命名查询将查询复杂性保留在手动声明的查询中等等。