我在JPA repository类中编写了一个查询,如下所示:
@Query("select student from Student " +
"student " +
" where student.class.id = :classId " +
" and student.course.id = :courseId " +
" and student.isDeleted = false")
List<Student> findDetails(
@Param("classId") String classId,
@Param("courseId") String courseId);
上述查询的问题是,如果参数:classId
和courseId
都为空,则需要获取所有记录,而这不会发生。到目前为止,没有获取任何记录。
基本上,我希望编写的查询能够正确地适用于所有情况,即参数classId
和courseId
都采用空值和非空值。
在这方面,我已经了解了CriteriaBuilder的概念,但无法正确掌握该概念以实现我的案例。
有人能帮忙吗?谢谢
编辑
我已经在控制台中记录了查询,如下所示:
select tcstudent_.id as id1_42_, tcstudent_.created_by as created_2_42_, tcstudent_.created_date as created_3_42_, tcstudent_.last_modified_by as last_mod4_42_, tcstudent_.last_modified_date as last_mod5_42_, tcstudent_.course_id as course_id7_42_, tcstudent_.class_id as class_id8_42_ from Student tcstudent_ where tcstudent_.class_id=? and tcstudent_.course_id=? and tcstudent_.is_deleted=0
以下条件查询可用于条件筛选
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<Student> criteriaQuery = criteriaBuilder.createQuery(Student.class);
Root<Student> itemRoot = criteriaQuery.from(Student.class);
ParameterExpression<Boolean> param = criteriaBuilder.parameter(Boolean.class, "isDeleted");
Predicate paramFalse = criteriaBuilder.isFalse(param);
//Constructing list of parameters
List<Predicate> predicates = new ArrayList<Predicate>();
//Adding predicates in case of parameter not being null
if (classId != null) {
predicates.add(
criteriaBuilder.equal(itemRoot.get("classId"), classId));
}
if (courseId != null) {
predicates.add(
criteriaBuilder.equal(itemRoot.get("courseId"), courseId));
}
predicates.add(paramFalse)
//query itself
criteriaQuery.select(itemRoot)
.where(predicates.toArray(new Predicate[]{}));
entityManager.createQuery(criteriaQuery).getResultList();
参考:https://www.baeldung.com/hibernate-criteria-queries
您可以通过添加为空或
条件来执行以下操作:
@Query("select student from Student " +
"student " +
" where (:classId is null or student.class.id = :classId )" +
" and (:courseId is null or student.course.id = :courseId )" +
" and student.isDeleted = false")
List<Student> findDetails(
@Param("classId") String classId,
@Param("courseId") String courseId);
我是JPA新手,这里是我的一个查询,我有几个参数作为查询的一部分,任何参数都可以是空值
在调试中,我得到visitreport.size()=27(即正确的记录计数),但是 visit.getValue()对于每行都是空值,尽管每个行的这个字段中没有空值。怎么了?
MySQL 提供了 IS NULL 关键字,用来判断字段的值是否为空值(NULL)。 空值不同于 0,也不同于空字符串。 如果字段的值是空值,则满足查询条件,该记录将被查询出来。如果字段的值不是空值,则不满足查询条件。 使用 IS NULL 的基本语法格式如下: IS [NOT] NULL 其中,“NOT”是可选参数,表示字段值不是空值时满足条件。 例 1 下面使用 IS NULL 关键字来查询
我试图使用JPA 2.1@NamedStoredProcedureQuery调用一个存储过程。我的实体类中有以下注释。 问题是,如果我将模式声明为ParameterMode,则无法传递空值。在里面只有当我声明为ParameterMode时,才能传递null值。伊努特。 实体 存储库 例如,如果我用ParameterMode传递null。对于索引2(城市),我得到了这个例外。
我不能执行这个声明。