如何用CASE WHEN简化Hibernate HQL列表参数非空判断查询
解决方案
不用CASE WHEN,直接通过逻辑表达式合并条件更简洁——CASE WHEN更适合字段值的分支判断,而这里是查询条件的分支控制,用逻辑组合更直接。
修改后的单条HQL查询代码
import java.util.Collections; import java.util.Date; import java.util.List; import java.util.Set; public List<Student> findStudent(Set<Student> listStudent, Date dateReg) { // 处理null参数,避免Hibernate传入空参数列表报错 Set<Student> studentSet = listStudent != null ? listStudent : Collections.emptySet(); return getSession().createQuery( "SELECT Student(s.studentId, s.firstname, s.lastname) " + "FROM Student s " + "WHERE s.registerDate = :registerDate " + "AND (:StudentList IS EMPTY OR s.studentId IN (:StudentList)) " + "ORDER BY s.lastname ASC" ) .setParameter("registerDate", dateReg) .setParameterList("StudentList", studentSet) .list(); }
逻辑说明
- 当
studentSet为空集合时,:StudentList IS EMPTY为真,此时条件等价于只过滤registerDate匹配的数据,和原代码else分支逻辑一致。 - 当
studentSet不为空时,:StudentList IS EMPTY为假,此时会执行s.studentId IN (:StudentList)的判断,和原代码if分支逻辑一致。
注意事项
- 必须把
null的listStudent转换成空集合,否则Hibernate在调用setParameterList时传入null会抛出异常。 - MariaDB 10和Hibernate完全支持这种逻辑表达式写法,不存在兼容性问题。
内容的提问来源于stack exchange,提问作者peace3106
相关产品推荐
相关产品推荐

