Spring 如何使用AND和OR条件生成Crudepository findBy方法签名?

Spring 如何使用AND和OR条件生成Crudepository findBy方法签名?,spring,hibernate,spring-data-jpa,jpql,Spring,Hibernate,Spring Data Jpa,Jpql,如何在JPARepository中生成与下面查询对应的findBy方法 select * from person where name=?1 and eff_dt < ?2 and (exp_dt >?2 OR exp_dt IS NULL) 从姓名=1且有效时间2或有效时间为空)的人员中选择* 从技术上讲,你可以做到这一点。但最好避免 假设您的实体类是 class Person { String name; Integer effDt; Integer expDt;

如何在JPARepository中生成与下面查询对应的findBy方法

select * from person where name=?1  and eff_dt < ?2 and (exp_dt >?2 OR exp_dt IS NULL)
从姓名=1且有效时间<2且(有效时间>2或有效时间为空)的人员中选择*

从技术上讲,你可以做到这一点。但最好避免

假设您的实体类是

class Person {
  String name;
  Integer effDt;
  Integer expDt;
  // getters and setters
}
您的方法名称将是

findByNameIsAndEffDtLessThanAndExpDtGreaterThanOrNameIsAndEffDtLessThanAndExpDtIsNull(String name, Integer effDt, Integer expDt, String name2, Integer effDt2);
//name and name2 will be same & effDt and effDt2 will be same.
//Boolean Algebra: A(B+C) = A.B + A.C

正如你所看到的,这是不必要的复杂和难以理解的。改用本机查询。

从技术上讲,您可以这样做。但最好避免

假设您的实体类是

class Person {
  String name;
  Integer effDt;
  Integer expDt;
  // getters and setters
}
您的方法名称将是

findByNameIsAndEffDtLessThanAndExpDtGreaterThanOrNameIsAndEffDtLessThanAndExpDtIsNull(String name, Integer effDt, Integer expDt, String name2, Integer effDt2);
//name and name2 will be same & effDt and effDt2 will be same.
//Boolean Algebra: A(B+C) = A.B + A.C

正如你所看到的,这是不必要的复杂和难以理解的。改为使用本机查询。

从姓名=?1、有效日期<?2和(有效日期>2或有效日期为空)的人员中选择* 通过变量的名称假设实体类

@Entity
public class Person{
    @Id
    @GeneratedValue
    private long id;

    private String name;

    private Date eff_dt;

    private Date exp_dt;

}
查询可以是

public final static String FIND_ALL_PERSONS="select s from Person p where p.name=:name   and p.eff_dt < :eff_dt and (exp_dt > : exp_dt OR exp_dt is null)";
@Query(FIND_ALL_PERSONS)
List<Person> findAllPersons(@Param("name")String name,@Param("eff_dt") eff_dt,@Param("exp_dt") Date axp_dt);
public final static String FIND_ALL_PERSONS=“从Person p中选择s,其中p.name=:name和p.eff_dt<:eff_dt和(exp_dt>:exp_dt或exp_dt为null)”;
@查询(查找所有人)
列出findAllPersons(@Param(“name”)字符串名称、@Param(“eff_dt”)eff_dt、@Param(“exp_dt”)日期axp_dt);

从姓名=1且有效时间<2且(有效时间>2或有效时间为空)的人员中选择* 通过变量的名称假设实体类

@Entity
public class Person{
    @Id
    @GeneratedValue
    private long id;

    private String name;

    private Date eff_dt;

    private Date exp_dt;

}
查询可以是

public final static String FIND_ALL_PERSONS="select s from Person p where p.name=:name   and p.eff_dt < :eff_dt and (exp_dt > : exp_dt OR exp_dt is null)";
@Query(FIND_ALL_PERSONS)
List<Person> findAllPersons(@Param("name")String name,@Param("eff_dt") eff_dt,@Param("exp_dt") Date axp_dt);
public final static String FIND_ALL_PERSONS=“从Person p中选择s,其中p.name=:name和p.eff_dt<:eff_dt和(exp_dt>:exp_dt或exp_dt为null)”;
@查询(查找所有人)
列出findAllPersons(@Param(“name”)字符串名称、@Param(“eff_dt”)eff_dt、@Param(“exp_dt”)日期axp_dt);

您的上述查询是否正确?重新检查。并显示您的实体类您创建了一个方法,选择您能想到的最好的方法名,然后用
@Query(“”
注释它。从方法名派生的查询对于findByName()这样的简单内容来说很好。它们不适用于像您这样更复杂的查询。您上面的查询是否正确?重新检查。并显示您的实体类您创建了一个方法,选择您能想到的最好的方法名,然后用
@Query(“”
注释它。从方法名派生的查询对于findByName()这样的简单内容来说很好。它们不适用于像您这样的更复杂的查询