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

时间:2018-07-30 14:01:46

标签: 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)

2 个答案:

答案 0 :(得分:1)

您可以从技术上做到这一点。但是最好避免这种情况。

假设您的实体类就像

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 :(得分:1)

从name =?1并且eff_dt <?2并且(exp_dt>?2 OR exp_dt为NULL的人)中选择* 假设实体类具有变量名

@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);