当前位置: 首页 > 知识库问答 >
问题:

对于给定的查询参数,具有空值和非空值的JPA查询

孔建柏
2023-03-14

我在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);

上述查询的问题是,如果参数:classIdcourseId都为空,则需要获取所有记录,而这不会发生。到目前为止,没有获取任何记录。

基本上,我希望编写的查询能够正确地适用于所有情况,即参数classIdcourseId都采用空值和非空值。

在这方面,我已经了解了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

共有2个答案

公羊伟志
2023-03-14

以下条件查询可用于条件筛选

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

柯冯浩
2023-03-14

您可以通过添加为空或条件来执行以下操作:

@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(城市),我得到了这个例外。

  • 我不能执行这个声明。