Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SpringDataJPA-如何通过方法名组合多个And或_Java_Spring Data Jpa_Spring Data - Fatal编程技术网

Java SpringDataJPA-如何通过方法名组合多个And或

Java SpringDataJPA-如何通过方法名组合多个And或,java,spring-data-jpa,spring-data,Java,Spring Data Jpa,Spring Data,我正在尝试迁移应用程序。我正在从Hibernate处理Spring数据Jpa 尽管SpringDataJPA提供了简单的查询构建方法,但我一直致力于创建同时使用和和或操作符的查询方法 MethodName-findByPlan\u PlantTypeInAndSetupStepIsNullorStepUpStepIs(…) 当它转换为查询时,前两个表达式组合在一起,并以[(exp1和exp2)或(exp3)]的形式执行 而必需的是](exp1)和(exp2或exp3)] 有人能告诉我这是否可以通

我正在尝试迁移应用程序。我正在从Hibernate处理Spring数据Jpa

尽管SpringDataJPA提供了简单的查询构建方法,但我一直致力于创建同时使用
或操作符
的查询方法

MethodName-
findByPlan\u PlantTypeInAndSetupStepIsNullorStepUpStepIs(…)

当它转换为查询时,前两个表达式组合在一起,并以
[(exp1和exp2)或(exp3)]的形式执行

而必需的是
](exp1)和(exp2或exp3)]


有人能告诉我这是否可以通过Spring data jpa实现吗?

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

@实体
@NamedQuery(name=“User.findByEmailAddress”,
query=“从用户u中选择u,其中u.emailAddress=?1”)
公共类用户{
}
公共接口用户存储库扩展了JpaRepository{
用户findByEmailAddress(字符串emailAddress);
}
选项2:使用
@Query
编写自定义查询(请参阅)

public interface UserRepository扩展了JpaRepository{
@查询(“从用户u中选择u,其中u.emailAddress=?1”)
用户findByEmailAddress(字符串emailAddress);
}

目前不可能,将来也不会。我认为,即使这是可能的,对于更复杂的查询,您也不会希望人为地将所有查询复杂度压缩到方法名称中。这不仅是因为很难理解查询中实际发生的事情,而且从客户机代码的角度来看也是如此:您希望使用表达性方法名称,对于简单的
findByUsername(…)
,查询派生允许您创建


对于更复杂的内容,您只需将查询复杂度提升到调用代码中,最好使用可读的方法名称,该名称在语义上表示查询的功能,并使用
@query
将查询复杂度保留在手动声明的查询中,命名查询等。

同意Oliver关于长且不可读的方法名称的观点,但出于论证的目的,您可以通过使用等价性来获得所需的结果

A /\ (B \/ C) <=> (A /\ B) \/ (A /\ C)
A and (B or C) <=> (A and B) or (A and C)
使用类似

findByFirstElementAndCriteriaOrSecondElementAndCriteria

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

谢谢您的回复!使用NamedQuery或Query的唯一缺点是,当同一个repo类中有多个联接查询时,会使类看起来非常混乱:(但话说回来,你的方法名不是开始看起来很乱,很难阅读吗?从方法名派生的查询对于简单的查询很方便-在某个时候,你应该切换到
@Query
或类似的方式。这基本上是可行的-但是:如何使用这种方法避免重复变量?(如果可能的话…)是的,这很有效…看起来你无法避免重复的参数。我使用了facade方法来隐藏笨拙的方法SignatureEyes,这很有效。很好地使用了原则。这很有效,但最大的缺点是,在查询中使用相同的条件时,你必须多次将它们作为参数传递。在这种情况下,你必须传递两个包含相同内容的变量:
findByFirstElementAndCriteriaOrSecondElementAndCriteria(元素元素1,标准元素1,元素元素元素2,标准元素2)//criteria1.equals(标准元素2)->true
findByFirstElementAndCriteriaOrSecondElementAndCriteria