hibernate汇总

来源:互联网 发布:新版淘宝怎么收藏店铺 编辑:程序博客网 时间:2024/05/18 19:23
package com.bjpowernode.hibernate;    import org.hibernate.Session;  import org.hibernate.SessionFactory;  import org.hibernate.cfg.Configuration;    public class HibernateUtils {            private static SessionFactory factory;        //static只初始化一次.      static      {          try{          //默认读取的是hibernate.cfg.xml 文件.                  Configuration cfg = new Configuration().configure();                                    //建立SessionFactory.                  factory = cfg.buildSessionFactory();                }catch(Exception e )          {              e.printStackTrace();          }      }            public static Session getSession()      {          //打开session.          return factory.openSession();      }            //关闭session.      public static void closeSession(Session session)      {          //判断是否为空.          //判断是否是打开状态再进行关闭.                    if(session!=null)          {              if(session.isOpen())              {                  session.close();              }          }      }            //返回工厂类.      public static SessionFactory getSessionFactory()      {          return factory;      }  }  

session的增删改查:

增:

session.save(user);

删:

session.delete(user);

改:

session.update(user);

查:

Queryquery = session.createQuery("from User");

ListuserList = query.list();

hibernate使用sql查询:

注意newHibernateCallback<Integer>()中的类型跟内部类返回值类型一致


    public List<Object[]> getRoles(){           return getHibernateTemplate().executeFind(new HibernateCallback(){               public Object doInHibernate(Session session)                       throws HibernateException, SQLException {                              Query q = session.createSQLQuery("select Role_Id, RoleDescription, RoleName from dbo.Role");                               return q.list();               }                      });       }  

    /**     * 标记公告已读     * @param userId     * @param noticeId     * @return     */    public Integer markReadOver(final int userId,final int noticeId){        final String sql_update_info="update REL_NOTICE_USERINFO set READ_OVER=? where NOTICE_ID=? and USER_ID=?";        return getHibernateTemplate().execute(new HibernateCallback<Integer>()        {            @Override            public Integer doInHibernate(Session session) throws HibernateException,                    SQLException            {                int count=session.createSQLQuery(sql_update_info)                            .setInteger(0, 1)                            .setInteger(1, noticeId)                            .setInteger(2, userId)                            .executeUpdate();                return count;            }        });    }



hibernate中sql参数绑定:

1.参数名称前面的冒号表示这是一个具名参数。

    String queryString = "from Item item where item.description like :search"; 
uery q = session.createQuery(queryString).setString("search",searchString); 
2.定位参数

    String queryString = "from Item item where item.description like ? and item.date > ?";    Query q = session.createQuery(queryString).setString(0,searchString).setDate(1,minDate); 

绑定参数位置的每一个变化都需要改变参数绑定代码,这样就产生了易碎和更需要维护的代码,建议避免使用定位

参数。如果必须使用定位参数,要记住hibernate是从0开始计数(JPA是从1开始记数);


3.查询有外键关联的表中的信息:

/** * 查询未批阅的用户 * @param readOver * @return */public List<RelNoticeUserInfo> selectUserInfoByParam(final int readOver,final int noticeId){    return getHibernateTemplate().execute(new HibernateCallback<List<RelNoticeUserInfo>>()    {        @Override        public List<RelNoticeUserInfo> doInHibernate(Session session) throws HibernateException,                SQLException        {            Criteria cri = session.createCriteria(RelNoticeUserInfo.class);            cri.add(Expression.eq("readOver", readOver));            cri.createAlias("eduNotice", "e");  //根据id查询关联表中所有信息            cri.add(Restrictions.eq("e.noticeId",noticeId));            List<RelNoticeUserInfo> resultList= cri.list();            return resultList;        }    });}
4、hibernate查询不区分大小写 HQL Criteria
如果是使用HQL,可以使用lower或者upper函数来实现 例1:from User u where lower(u.username)=lower(’Mp3′)  这样就可以查出来mp3,mP3等用户了! 例2:String hql = "select distinct userName from User where upper(userName) like upper('%" + userName + "%')";如果使用Criteria,首先使用Restrictions创建Criterion 如果是字符串相等匹配Restrictions.eq(’username’,'mp3′).ignoreCase()如果是字符串模糊匹配Restrictions.ilike(’username’,'mp3′)或者Restrictions.like(’username’,'mp3′).ignoreCase()
5、sql与hql的区别:
sql 面向数据库表查询hql 面向对象查询hql : from 后面跟的 类名+类对象 where 后 用 对象的属性做条件         并且hql(前面提到它是OO的)中那么对象类的名称和属性确实大小写敏感的(符合java编程语法)。 sql: from 后面跟的是表名 where 后 用表中字段做条件查询在Hibernate中使用查询时,一般使用Hql查询语句。HQL(Hibernate Query Language),即Hibernate的查询语言跟SQL非常相像。不过HQL与SQL的最根本的区别,就是它是面向对象的。








0 0
原创粉丝点击