`
xhy0422
  • 浏览: 279552 次
社区版块
存档分类
最新评论

spring+hibernate+proxool错误总结 HibernateTemplate 常用函数(附件)

阅读更多
xml 代码
1 hibernate映射 
java 代码
  1. <class name="hibernatePojo.Chapter" table="chapter" catalog="teachflat">  
使得sql语句中数据库表名为teachflat_chapter从而导致数据库表不存在的异常,应去掉 catalog="teachflat"
2  添加Hibernate Libraries...时,加入Hibernate 3.0 Core Libraries是使用Hibernate的需要,加入Spring 1.2 ORM/DAO/Hibernate3 Libraries是使用HibernateTemplate的需要即DAO extends HibernateDaoSupport,并且一定要选择Copy Checked Library Jars to project folder and add to build path,否则注入时会找不到org/hibernate/session,为使用spring注入管理数据库操作,选择创建spring configfile 到WEB-INF目录,如果用proxool连接池可以不创建DataSource,也不用创建factory.
proxool的配置文件Proxool.xml放在src目录或其子目录下,通过spring的配置文件去找
3 tomcat在启动的时候就报错了。错误日志如下
严重: org.apache.catalina.core.StandardContext start
xml 代码
  1. <listener>  
  2.   <listener-class>org.springframework.web.util.Log4jConfigListenerlistener-class>  
  3. listener>  
  4. <listener>  
  5.   <listener-class>org.springframework.web.context.ContextLoaderListenerlistener-class>  
  6. listener>  
  7. 写成如下形式就ok了   
  8. <servlet>  
  9.   <servlet-name>SpringContextServletservlet-name>  
  10.   <servlet-class>org.springframework.web.context.ContextLoaderServletservlet-class>  
  11.   <load-on-startup>1load-on-startup>  
  12. servlet>  
  13. <servlet>  
  14.   <servlet-name>SpringLog4jConfigServletservlet-name>  
  15.   <servlet-class>org.springframework.web.util.Log4jConfigServletservlet-class>  
  16. servlet>   
像BaseDAO里的原有三个接口
  1. find(String hql);
  2. find(String hql,Object arg);
  3. find(String hql,Object[] arg);

可精简为一个

  1. find(String hql,Object... args);

用户用如下四种方式调用该接口都是合法的

  1. find(hql);
  2. find(hql,arg0);
1,使Spring的getHibernateTemplate() 多条件的查询时使find(String hql Object b[])方法其中hql中的的?在 b中一次列出,这样就返回一个符合条件的List对象.


     
java 代码
  1. public List searchAll(){   
  2.     List list=null;   
  3.     try{   
  4.      Ceshi cs=new Ceshi();   
  5.      cs.setPassword("123");//必须 符合的条件但是这两个条件时并列的(象当于sql中的and)   
  6.      cs.setName("bb");   
  7.      list=this.getHibernateTemplate().findByExample(cs,start,max);   
  8.  }catch(RuntimeException re){   
  9.   throw re;   
  10.  }   
  11.  return list;   
  12.    }    我觉得start max是取结果集的一部分

findByNamedParam的使用

数据库中有一表Member(id,email),已经有一条记录('123','sdf@sfd.com');

使
以下语句查询:

String hql = "select count(*) from Member where email=:email and id!=:id";

List list = this.support.getHibernateTemplate().
findByNamedParam(hql,new String[] { "email", "id" },new Object[] { "sdf@sfd.com", null });

System.out.println(list.get(0));

打印结果为0

把其中的new Object[] { "sdf@sfd.com", null });
改为new Object[] { "sdf@sfd.com", "" });
,,结果就为1

我使p6spy看执行的语句,发现这两句生成的SQL是一模一样的,都是 select count(*) ..... and id<>''

为什么一个能查得出来,一个查不出来???真是奇怪。请各位大哥帮忙

对于这个问题,其实生成的两个语句并不一样的,在MYSQL的LOG中,可以看到为""的那个为select ... and id<>'',为null的那个为select ... and id<>NULL

这一点,p6spy结果的日志记录是错误的

NULL值在MYSQL是一个非常特殊的,它表示“不确定”,任何东西与它比较(包括NULL本身)都返回的是NULL,是查不出结果的  
select ... and id<>NULL 在HQL中 判断是否为null 都是 is null or is not null

findByNamedQuery的使用

java 代码
  1. 定义并使用更多的查询以展示可以完成的操作。Hibernate 可以用预定义查询将查询存储到源代码之外,如清单 4 所示。   
  2.   
  3.   清单 4. 预定义查询   
  4.   [User.java]   
  5.   
  6. /**  
  7.  * @author Richard Hightower  
  8.  * ArcMind Inc. http://www.arc-mind.com  
  9.  * @hibernate.class table="TBL_USER" discriminator-value="2"  
  10.  * @hibernate.discriminator column="USER_TYPE"  
  11.  *  
  12.  * @hibernate.query name="AllUsers" query="from User user order by user.email asc"  
  13.  *  
  14.  * @hibernate.query name="OverheadStaff"  
  15.  * query="from Employee employee join employee.group g where g.name not in ('ENGINEERING','IT')"  
  16.  *  
  17.  * @hibernate.query name="CriticalStaff"  
  18.  * query="from Employee employee join employee.group g where g.name in ('ENGINEERING','IT')"  
  19.  *  
  20.  * @hibernate.query name="GetUsersInAGroup"  
  21.  * query="select user from Group g join g.users user"  
  22.  *  
  23.  * @hibernate.query name="GetUsersNotInAGroup"  
  24.  * query="select user from User user where user.group is null"  
  25.  *  
  26.  * @hibernate.query name="UsersBySalaryGreaterThan"  
  27.  * query="from User user inner join user.contactInfo info where info.salary > ?1"  
  28.  *  
  29.  * @hibernate.query name="UsersBySalaryBetween"  
  30.  * query="from User user join user.contactInfo info where info.salary between ?1 AND ?2"  
  31.  *  
  32.  * @hibernate.query name="UsersByLastNameLike"  
  33.  * query="from User user join user.contactInfo info where info.lastName like ?1"  
  34.  *  
  35.  * @hibernate.query name="GetEmailsOfUsers"  
  36.  * query="select user.email from Group g join g.users as user where g.name = ?1"  
  37.  *  
  38.  */  
  39. public class User {   
  40.    .   
  41.    .   
  42.    .      
  43.   
  44.   上述代码定义了几个预定义查询。预定义查询 是存储在 *.hbm.xml 文件中的查询。在清单 5 中,可以看到如何执行预定义查询。   
  45.   
  46.   清单 5. 使用预定义查询   
  47.   [UserDAO.java]   
  48.   
  49.  /**  
  50.   * Demonstrates a query that returns a String.  
  51.   */                  
  52.  public String[] getUserEmailsInGroup(String groupName){   
  53.   List emailList =   
  54.   getHibernateTemplate().findByNamedQuery("GetEmailsOfUsers");   
  55.   return (String [])   
  56.    emailList.toArray(new String[emailList.size()]);   
  57.  }   
  58.   
  59.  /**  
  60.   * Demonstrates a query that returns a list of Users  
  61.   *  
  62.   * @return A list of emails of all of the users in the authentication system.  
  63.   *  
  64.   */                  
  65.  public List getUsers(){   
  66.   return getHibernateTemplate().findByNamedQuery("AllUsers");   
  67.  }   
  68.   
  69.       /**  
  70.  * Demonstrates passing a single argument to a query.  
  71.  *  
  72.  * @return A list of UserValue objects.  
  73.  *  
  74.  */                      
  75.  public List getUsersBySalary(float salary){   
  76.     return getHibernateTemplate()   
  77.         .findByNamedQuery("UsersBySalaryGreaterThan",   
  78.              new Float(salary));   
  79.  }   
  80.   
  81.  /**  
  82.   * Demonstrates passing multiple arguments to a query  
  83.   *  
  84.   * @return A list of UserValue objects.  
  85.   *  
  86.   */                      
  87.  public List getUsersBySalaryRange(float start, float stop){   
  88.                 return getHibernateTemplate()   
  89.    .findByNamedQuery("UsersBySalaryBetween",   
  90.    new Object[] {new Float(start), new Float(stop)});   
  91.  }   

                         

findByNamedQueryAndNamedParam的使用
    public User loadByName(String account)  throws DAOException{
         List result = getHibernateTemplate().findByNamedQueryAndNamedParam("loadUserByName", "userAccount", account);
         if (result != null ) {
            return (User)result;
        } else {
            return null;
        }
    }
    这是在user.hbm.xml中的代码:
    <query name="loadUserByName">
                    <![CDATA[select user from user as user where user.name=:userAccount]]>
            </query>
  • 描述: HibernateTemplate 常用函数
  • 大小: 64.8 KB
分享到:
评论
1 楼 xiaofengtoo 2007-08-25  
好文章 ! 学习中!谢谢!

相关推荐

Global site tag (gtag.js) - Google Analytics