比较hibernate查询结果中的空值如此简单!

本文讨论了在使用Hibernate查询数据库时遇到NullPointerException错误的问题,特别是当查询到的字段值为空时的情况。提供了处理策略,包括如何正确地处理空值比较,避免错误发生。同时分享了一个类似的网上问题案例作为参考。

hibernate查询数据库字段时报错:java.lang.NullPointerException,经检查,原来是某些字段为空值,如何处理呢?...

 

缘起: 

        hibernate查询数据库字段时报错:java.lang.NullPointerException,经检查,原来是某些字段为空值,如何处理呢?...

修改前的语句(报错):

  Session newSession = HibernateUtil.getSessionFactory().openSession();
  Transaction newTransaction = newSession.beginTransaction();

  List etlTables = newSession.createQuery("from Table ").list();
  for (Iterator iter = eTables.iterator(); iter.hasNext();) {
   ETable eTable = (ETable) iter.next();

   if    (eTable.getNumRowsCurrSource() <= 10000 ) ) {

......

 

处理后的语句(正常运行,允许空值出现):

  Session newSession = HibernateUtil.getSessionFactory().openSession();
  Transaction newTransaction = newSession.beginTransaction();
  
  List eTables = newSession.createQuery("from Table ").list();
  for (Iterator iter = eTables.iterator(); iter.hasNext();) {
   ETable eTable = (ETable) iter.next();

   if ((eTable.getNumRowsCurrSource() == null )||
   (eTable.getNumRowsCurrSource() <= 10000 ) ) {

......

关键点:

  可以直接比较一个对象和null

走过的弯路: eTable.getNumRowsCurrSource().equals(null) 等均为错误的。

 


以下是网上的一个朋友遇到的同样的问题:(http://java.vkfz.com/Topic.aspx

我用Hibernate与数据库取数据,当取得数据库的某条记录都有值的时候,一切正常,而某条为NULL值是就报错
严重: Servlet.service() for servlet jsp threw exception
java.lang.NullPointerException
at org.apache.jsp.testHibernate_jsp._jspService(org.apache.jsp.testHibernate_jsp:90)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:99)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:325)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:295)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:245)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:825)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:738)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:526)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Thread.java:595)
请问有谁知道这是为什么吗?

 

我用Hibernate与数据库取数据,
当取得数据库的某条记录都有值的时候,一切正常,
而当某条记录中的某个字段值为NULL值是就报错以上错误
org.hibernate.Session s = HibernateUtil.currentSession();
String hql1 =" from Cat";
try {
Query query = s.createQuery(hql1);
List catlist = query.list();
Cat c=(Cat)catlist.get(0);
CatId cat = ((Cat)catlist.get(0)).getId();
out.println(cat.getName());
out.println("<br/>");
} catch (org.hibernate.HibernateException e) {
e.printStackTrace();
}
HibernateUtil.closeSession();

=======================

我给他的解答:

对out.println(cat.getName());进行处理:
if cat.getName() != null
then{ 打印}

--by chq
http://www.chq.name


 

<think> 我们正在讨论SQL中如何查询空值NULL)以及如何查询包含空值的数据。根据用户的问题,他想要了解判断空值以及查询空值数据的方法。结合之前的引用回答,我们可以总结如下: 1. 判断空值必须使用 `IS NULL` 或 `IS NOT NULL`,不能使用等于号(=)或不等号(!=)来比较NULL。 2. 在查询中,我们可以通过WHERE子句来筛选出空值或非空值的数据行。 3. 在动态SQL(如MyBatis)中,处理空值查询需要特别注意,通常使用条件判断(如`<if>`标签)来构建不同的SQL片段。 另外,引用中提供了相关的示例: - 引用[2]给出了查询空值行的基本SQL语句:`SELECT 教师号,教师姓名 FROM teacher WHERE 教师姓名 IS NULL;`(查询空值`SELECT 教师号,教师姓名 FROM teacher WHERE 教师姓名 IS NOT NULL;`(查询空值)。 - 引用[3]解释了为什么不能使用`= NULL`:因为任何值与NULL进行逻辑判断都会返回unknown,而在WHERE子句中unknown被视作false。 - 引用[4][5]展示了在MyBatis中如何根据传入参数是否为空来动态构建查询条件(包括空值空字符串的情况)。 因此,回答应该包括: 1. 基本查询方法(使用IS NULLIS NOT NULL)。 2. 注意点(为什么不能用等号)。 3. 动态SQL中的处理(如MyBatis示例)。 同时,用户的问题要求生成相关问题,所以最后需要添加相关问题部分。 回答结构: ### SQL查询空值的方法 #### 1. 基本查询语法 - 查询空值:`IS NULL` - 查询空值:`IS NOT NULL` - 示例代码 - 重要提醒:不能使用等号 #### 2. 空值与空字符串的区别处理 - 同时判断空值空字符串的情况(如引用[4][5]中的示例) #### 3. 在动态SQL中处理空值(以MyBatis为例) - 条件判断构建查询 最后,生成相关问题。 </think> ### SQL中查询判断空值及处理空值数据的方法详解 #### 一、基本空值查询方法 **1. 判断字段是否为空** 使用标准 SQL 语法 `IS NULL` `IS NOT NULL`: ```sql -- 查询空值数据 SELECT * FROM employees WHERE bonus IS NULL; -- 查询空值数据 SELECT * FROM employees WHERE bonus IS NOT NULL; ``` > 关键点:**禁止使用 `= NULL`**(如 `WHERE bonus = NULL`),SQL 标准规定 `NULL = NULL` 返回 `unknown` 而非 `TRUE`[^3] **2. 空值与空字符串的联合查询** 当需要同时检测 NULL 空字符串时: ```sql SELECT * FROM users WHERE username IS NULL OR username = ''; ``` #### 二、聚合场景的空值处理 **1. 空值统计与比例计算** ```sql -- 计算单字段空值比例 SELECT COUNT(*) AS total, COUNT(*) - COUNT(bonus) AS null_count, (COUNT(*) - COUNT(bonus)) * 1.0 / COUNT(*) AS null_ratio FROM employees; ``` **2. 分组中的空值处理** ```sql -- NULL 会被单独分组 SELECT dept_id, AVG(COALESCE(bonus, 0)) FROM employees GROUP BY dept_id; ``` #### 三、动态 SQL 中的空值处理(以 MyBatis 为例) **1. 条件分支处理** 根据参数动态生成查询条件: ```xml <select id="findData"> SELECT * FROM table_name WHERE 1=1 <if test="templateCode != null"> AND template_code = #{templateCode} <!-- 非空时精确匹配 --> </if> <if test="templateCode == null"> AND (template_code IS NULL OR template_code = '') <!-- 空值时联合查询 --> </if> </select> ``` > 执行逻辑: > - 当 `templateCode` 非空 ➜ 执行精确查询 > - 当 `templateCode` 为空 ➜ 查询 NULL 或空字符串[^4][^5] **2. 空值安全关联查询** ```xml <select id="joinQuery"> SELECT e.*, COALESCE(d.name, '未分配') FROM employees e LEFT JOIN department d ON e.dept_id = d.id <where> <if test="deptName != null"> AND d.name = #{deptName} </if> <if test="deptName == null"> AND d.name IS NULL <!-- 处理关联字段为空 --> </if> </where> </select> ``` #### 四、最佳实践与注意事项 1. **索引优化**: `WHERE column IS NULL` 可利用索引(需数据库支持) 2. **空值转换**: 使用 `COALESCE()` 避免计算错误: ```sql SELECT AVG(COALESCE(bonus, 0)) FROM employees; -- NULL 转 0 参与计算 ``` 3. **设计规范**: 建表时明确列约束: ```sql CREATE TABLE users ( id INT PRIMARY KEY, username VARCHAR(50) NOT NULL -- 禁止空值 ); ``` 4. **更新操作防护**: ```sql UPDATE employees SET bonus = 1000 WHERE bonus IS NULL; -- 显式限定条件 ``` > **本质区别**:空值 `NULL` 代表"缺失的未知值",而空字符串 `''` 是"已知的零长度值"。这导致 `NULL` 在聚合、排序比较时有特殊行为[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值