论坛首页 Java企业应用论坛

如果查询的字段中有空的值,hibernate怎么查询不到所需要的糪\0...

浏览 18167 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2003-10-10  
表中有如下纪录:(logonid  为key)
------------------------------------------------------------------
logonid  emailadress  lastlogon  password  name
--------   ---------------   -----------   ------------  --------
1            1@y.com      2                20                 20
11          4·@n.com     3                444               77
2   
3
4            2@y.com


欲查询密码和用户名称均为空的纪录。即(希望结果为3条纪录:logonid为:2,3,4)
写下如下代码:
     String queryString = "select user from User as user where user.password = :pass and user.userName=:nam";
      net.sf.hibernate.Query query = session.createQuery(queryString);;
      query.setString("pass", "");;
      query.setString("nam", "");;
      System.out.println("----list-1--------");;
      for (java.util.Iterator it = query.iterate();; it.hasNext();; ); {
        User us = (User); it.next();;
        System.out.println(us.getUserID(); + "   Password: " + us.getPassword(););;
      }
      System.out.println("--------------------------\r\n");;

运行结果不是所希望的3条纪录。
一条都查不出来!!
请教为得到所希望的结果如何操作?
如果以后碰到对此中空值的查询改怎么做
   发表时间:2003-10-10  
空(null)和空串("")是不一样的吧。
0 请登录后投票
   发表时间:2003-10-10  
yehs220 写道
空(null)和空串("")是不一样的吧。

嗯,我在数据库添加纪录的时候就没有对其它字段符值。如就插入关键字即可。总之我在数据库里面数据的样子和上面格式相同。

改后代码如下:
 

     String queryString = "select user from User as user where user.password = :pass and user.userName=:nam"; 
      net.sf.hibernate.Query query = session.createQuery(queryString);; 
      query.setString("pass", null);; 
      query.setString("nam", null);; 
      System.out.println("----list-1--------");; 
      for (java.util.Iterator it = query.iterate();; it.hasNext();; ); { 
        User us = (User); it.next();; 
        System.out.println(us.getUserID(); + "   Password: " + us.getPassword(););; 
      } 
      System.out.println("--------------------------\r\n");;  


问题依然存在,为什么呢?
0 请登录后投票
   发表时间:2003-10-10  
select user from User as user where user.password is null and user.userName is null
0 请登录后投票
   发表时间:2003-10-10  
yehs220 写道
select user from User as user where user.password is null and user.userName is null


代码改为:
      //String queryString = "select user from User as user where user.password = :pass and user.userName = :nam";
      String queryString = "select user from User as user where user.password is null and user.userName is null";

      net.sf.hibernate.Query query = session.createQuery(queryString);;
      //query.setString("pass", "22");;
      //query.setString("nam", "22");;
      System.out.println("----list-1--------");;
      for (java.util.Iterator it = query.iterate();; it.hasNext();; ); {
        User us = (User); it.next();;
        System.out.println(us.getUserID(); + "   Password: " + us.getPassword(););;
      }
      System.out.println("--------------------------\r\n");;
问题依然查到0个纪录。


代码改为:
      String queryString = "select user from User as user where user.password is :pass and user.userName is :nam";
      net.sf.hibernate.Query query = session.createQuery(queryString);;
      query.setString("pass", null);;
      query.setString("nam", null);;
      System.out.println("----list-1--------");;
      for (java.util.Iterator it = query.iterate();; it.hasNext();; ); {
        User us = (User); it.next();;
        System.out.println(us.getUserID(); + "   Password: " + us.getPassword(););;
      }
      System.out.println("--------------------------\r\n");;


出现意外错误:
ERROR [main] (JDBCException.java:37); - Could not execute query
COM.ibm.db2.jdbc.DB2Exception: [IBM][CLI Driver][DB2/NT] SQL0104N  在 "ere (user0_.Password" 之后发现意外的记号 "is"。期望的记号可能包括:"IN"。  SQLSTATE=42601
	at COM.ibm.db2.jdbc.net.SQLExceptionGenerator.throw_SQLException(SQLExceptionGenerator.java:244);
	at COM.ibm.db2.jdbc.net.SQLExceptionGenerator.check_return_code(SQLExceptionGenerator.java:408);
	at COM.ibm.db2.jdbc.net.SQLExceptionGenerator.check_return_code(SQLExceptionGenerator.java:386);
	at COM.ibm.db2.jdbc.net.DB2PreparedStatement.executeQuery(DB2PreparedStatement.java:973);
	at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:179);
	at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:179);
	at net.sf.hibernate.impl.BatcherImpl.getResultSet(BatcherImpl.java:71);
	at net.sf.hibernate.loader.Loader.getResultSet(Loader.java:551);
	at net.sf.hibernate.hql.QueryTranslator.iterate(QueryTranslator.java:805);
	at net.sf.hibernate.impl.SessionImpl.iterate(SessionImpl.java:1409);
	at net.sf.hibernate.impl.QueryImpl.iterate(QueryImpl.java:64);
	at dbdemo.HibernateDemoOneToMany.run(HibernateDemoOneToMany.java:154);
	at dbdemo.HibernateDemoOneToMany.main(HibernateDemoOneToMany.java:26);
0 请登录后投票
   发表时间:2003-10-10  
SQL字符串里IS NULL语句不对,不能把NULL换成变量的吧。

我记得有些数据库是用函数来判断当前FIELD是否为NULL的。

所以么,还要想想。要么从数据库上就保证不为NULL,省事。
0 请登录后投票
   发表时间:2003-10-10  
liang_chen 写道
SQL字符串里IS NULL语句不对,不能把NULL换成变量的吧。

我记得有些数据库是用函数来判断当前FIELD是否为NULL的。

所以么,还要想想。要么从数据库上就保证不为NULL,省事。



意思是说处理表记录中含有null或者空字符窜很麻烦么?

难道在处理数据库的时候要保证所有纪录中每个字段都有值。但是有些非关键字段可以为空或者为空值符串""的阿。(在实际中表中应该有很多纪录都是象上面贴出的记录一样不完整才对阿)
如 写插入语句的时候就插入了关键字段,其他字段都没有给值。

能给出个处理这种情况可行的办法来么?怎么样才能查询处所想得到的3条纪录。
0 请登录后投票
   发表时间:2003-10-10  
我是意思是,根据上面那个程序的出错信息,我觉得在PreparedStatement里把IS NULL中的NULL变成?或变量  是不对的。
0 请登录后投票
   发表时间:2003-10-10  
是啊
可是怎么解决这个问题呢/
大家在应用中也该会碰到这种问题吧?
不可能每个记录都写的全全的吧
0 请登录后投票
   发表时间:2003-10-10  
但从商业逻辑上讲,NULL好像是没用的。
对用户名来讲,要么没有这个用户名,要么用户名为“”,要么为“ABC”等。

所以你这个方法,找为NULL的用户名和密码,对于比较实际的应用来说,好像用处不大。

顶多写个检查表的小程序,来清理一下表中的非法数据,那么也不需要用Hibernate了,对吧。

我没有正面回答问题,抱歉。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics