Java 使用SpringDataJPA,如何在同一字段上创建具有多个条件的查询?

Java 使用SpringDataJPA,如何在同一字段上创建具有多个条件的查询?,java,spring,spring-data-jpa,jpql,Java,Spring,Spring Data Jpa,Jpql,我需要帮助创建一个JPQL查询出一个本机查询或条件连同其他字段。请让我知道,如果它仍然不支持JPA 本机查询示例: select * from EMP where (EMP_FLAG is NULL or EMP_FLAG is 'Y') and EMP_ID in (1,2,3); 现在,为了使用JPQL(Java持久查询语言),我使用源代码编写了以下内置查询 findByEmpIdInAndEmpFlagIsNotNull(List<Long> ids); findbyemp

我需要帮助创建一个JPQL查询出一个本机查询或条件连同其他字段。请让我知道,如果它仍然不支持JPA

本机查询示例:

select * from EMP where (EMP_FLAG is NULL or EMP_FLAG is 'Y') and EMP_ID in (1,2,3);
现在,为了使用JPQL(Java持久查询语言),我使用源代码编写了以下内置查询

findByEmpIdInAndEmpFlagIsNotNull(List<Long> ids);
findbyempidinandemplaginisnotnull(列表ID);
但是如何合并EMP_标志='Y'的检查

注**我不打算使用@query注释添加查询。(意识到 (该解决方案的组成部分)

Spring版本:4.2,
JAVA:1.7

选择最适合您的方法的名称,并用

@Query("select e from Employee e where (e.empFlag is null of e.empFlag = 'Y') and e.empId in ?1")

选择您认为最适合您的方法的名称,并对其进行注释

@Query("select e from Employee e where (e.empFlag is null of e.empFlag = 'Y') and e.empId in ?1")
你可以这样做

@Query("select e from EMP e where (e.empFlag is null of e.empFlag ='Y')and in :ids")
findByEmpIdIn(@Param("ids") List<Long> ids);
@Query(“从EMP e中选择e,其中(e.empFlag为null of e.empFlag='Y')和in:id”)
findByEmpIdIn(@Param(“ids”)列表id);
您可以这样做

@Query("select e from EMP e where (e.empFlag is null of e.empFlag ='Y')and in :ids")
findByEmpIdIn(@Param("ids") List<Long> ids);
@Query(“从EMP e中选择e,其中(e.empFlag为null of e.empFlag='Y')和in:id”)
findByEmpIdIn(@Param(“ids”)列表id);

我知道这个解决方案,但我愿意使用类似findBy的东西,我不必写@Query thing。由方法名生成的自动查询不应该被滥用。对于findByName()等简单的东西,它们很方便,但是对于您拥有的东西,它们比您自己编写查询更难编写,它们会导致非常长和神秘的方法名,并且这些方法名必须在实际条件更改时立即更改(例如,如果您开始使用布尔字段而不是Y/N).我同意更改方法名称的建议。但是使用自动查询有什么错呢?它有几个优点。代码看起来更清晰,即使后端的某些DB配置发生更改,也不会出现故障。如果它是一个布尔字段,无论如何,本机查询中的情况也会发生变化,因此在代码中所做的更改即使不是更少,也是相等的。@Dish不确定我是否理解。如果将方法命名为“findActiveEmployees()”并使用
@Query
对其进行注释,则更改处理标志的方式只会更改查询注释的值。方法名以及调用此方法的所有位置都不需要更改。这比“FindByempFlagQualsyandEmpidin”要好得多,这是一个糟糕的名称,当您决定使用布尔值而不是字符串作为标志时,必须将其更改为“FindByempFlagQualsTrueAndEmpidin”。这就是我之前评论的全部意思。好吧,如果标志是布尔而不是字符串,我认为这是可能的(FindByEmpFlagQualStrueandEmpidin)。我知道这个解决方案,但我愿意使用类似于findBy的东西,我不必写@Query thing。由方法名生成的自动查询不应该被滥用。对于findByName()等简单的东西,它们很方便,但是对于您拥有的东西,它们比您自己编写查询更难编写,它们会导致非常长和神秘的方法名,并且这些方法名必须在实际条件更改时立即更改(例如,如果您开始使用布尔字段而不是Y/N).我同意更改方法名称的建议。但是使用自动查询有什么错呢?它有几个优点。代码看起来更清晰,即使后端的某些DB配置发生更改,也不会出现故障。如果它是一个布尔字段,无论如何,本机查询中的情况也会发生变化,因此在代码中所做的更改即使不是更少,也是相等的。@Dish不确定我是否理解。如果将方法命名为“findActiveEmployees()”并使用
@Query
对其进行注释,则更改处理标志的方式只会更改查询注释的值。方法名以及调用此方法的所有位置都不需要更改。这比“FindByempFlagQualsyandEmpidin”要好得多,这是一个糟糕的名称,当您决定使用布尔值而不是字符串作为标志时,必须将其更改为“FindByempFlagQualsTrueAndEmpidin”。这就是我之前评论的全部意思。好吧,如果标志是布尔而不是字符串,我认为这是可能的(FindByEmpFlagQualStrueandEmpidin)。如果在这个特定场景中无法使用内部生成查询,请给出建议。。我不是只寻找自动查询,我想了解JPQL为我们提供的可能性。如果在这个特定场景中无法使用内置查询,请给出建议。。我不是只寻找自动查询,我想了解JPQL为我们提供的可能性。我想实现这样一个查询“从emp e中选择e.*(timestamp>e.startDate和timestamp e.startDate,e.endDate为null)”,如何编写HQL?嗨,Suresh,我有一个类似的问题。我想实现这样一个查询“从emp e where(timestamp>e.startDate和timestamp e.startDate以及e.endDate为null)中选择e.*”,如何编写HQL?