zoukankan      html  css  js  c++  java
  • hql 跟 sql 区别

       

    hql 跟 sql 区别  
    1.hql与sql的区别 
    sql 面向数据库表查询 hql 面向对象查询 
    hql : from 后面跟的 类名+类对象 where 后 用对象的属性做条件 sql: from 后面跟的是表名   where 后 用表中字段做条件 查询 
           在Hibernate中使用查询时,一般使用Hql查询语句。 
    HQL(Hibernate Query Language),即Hibernate的查询语言跟SQL非常相像。不过HQL与SQL的最根本的区别,就是它是面向对象的。 
      
    使用HQL时需要注意以下几点:   
    l  大小写敏感 
    因为HQL是面向对象的,而对象类的名称和属性都是大小写敏感的,所以HQL是大小写敏感的。 Eg. 
    HQL语句:from Cat as cat where cat.id > 1;与from Cat as cat where cat.ID > 1;是不一样的,这点与SQL不同。 
      
    l     from子句 
    Eg. from Cat,该句返回Cat对象实例,开发人员也可以给其加上别名,eg. from Cat as cat,对于多表查询的情况,可参考如下: 
    from Cat as cat, Dog as dog 
    其它方面都与SQL类似,在此不再赘述。 接下来讲一个在Hibernate中查询的例子。 

      


    1.1简单查询 
    List list = session.createQuery("from User as user order by user.loginName").list(); 

    1.2带单个参数的查询 
    List list = session.find("from User as user where user.loginName=?",   loginName,     Hibernate.STRING);

     1.3多个参数的查询 

    Eg1. 此例采用“?”占位符的方式 
    String hql = "from User as user where user.loginName=? and user.orgId=? "; Query query = session.createQuery(hql); query.setParameter(1, 'amigo'); query.setParameter(2, new Long(1))  List list = query .list(); 
    Eg2. 此例采用“:paramName”的方式 
    String hql = "from User as user where user.loginName=:loginName and user.orgId=:orgId "; 
    Query query = session.createQuery(hql); query.setParameter('loginName', 'amigo'); query.setParameter('orgId', new Long(1))  List list = query .list(); 1.4查询数量 int 
    count 

    (Integer) 
    session.createQuery("select 
    count(*) 
    from 
    User").uniqueResult().intValue(); 
    1.5限制查询起始值和数量的查询 
    这种一般是在记录需要分页的时候需要用到,例如,在如下的代码中,限制查询的开始记录的位置为50,最大查询条数为50。 

    String hql = "from User as user order by user.loginName"; int firstResult= 50; int maxResults = 50; 
    Query query = session.createQuery(hql); query = query.setFirstResult(firstResult); query.setMaxResults(maxResults); 1.6子查询 
    在某些情况下,也需要用到子查询,例如在下面的例子中,User为用户对象,UserRole为用户与角色关联对象。如下HQL语句将没有分配角色的用户对象查找出来。 
    String hql = "from User user where user.loginName" + " not in(select ur.user.loginName from UserRole ur) "; List list = (session.createQuery(hql)).list(); 1.7原生SQL查询 
    对于某些复杂的查询语句,需要调用某种特定的数据库的特定函数才能解决,Hibernate虽然不推荐使用原生SQL语句来查询,因为这将破坏数据库的易移植性,但是Hibernate中也提供了使用原生SQL进行查询的方法,只需要获得连接即可。 
    Eg. 在下面的例子中,用到了Sql Server数据库中的原生sql语句,如下所示: String timeUnit = "13"; 
    String sql = "select count(*) count, CONVERT(VARCHAR(" + timeUnit +"), log.gen_datetime,121) timeUnit " + "from Log log"; 
    SQLQuery query = session.createSQLQuery(sql) .addScalar("count", Hibernate.INTEGER) .addScalar("timeUnit", Hibernate.STRING); List list = query.list();

      2 新增 
           在数据库中新增记录在Hibernate中不需要使用insert命令,只需要构造新增的对象后,调用Session对象的save(…)方法即可。 
    2.1新增单个对象 
           新增单个对象的实例如下,该实例将在用户表中新增一条记录。 Session session = HibernateSessionFactory.getSession();          Transaction ts = null; try { 
    ts = session.beginTransaction(); 
                      User user = new User();                   user.setLoginName("amigo");                   user.setFullName("阿蜜果");                   …… 
                      session.save(user)                     ts.commit(); } catch (Exception e) { 
                      if (ts != null) { ts.rollback(); } 
    } finally { 
                       HibernateSessionFactory.closeSession(); } 
    2.2批量新增对象 
    对于批量新增对象的情况,需要在新增一部分对象后flush和clear一次,例如,没批量新增20个对象时手动的flush一次,假设在list为一个用户列表,里面包含很多User对象,那么要将实现这些对象的批量新

    增,可采用如下方法: 
    Session session = HibernateSessionFactory.getSession(); Transaction ts = null; try { 
    ts = session.beginTransaction(); for (int i = 0; i < list.size(); i++) { 
                                User user = (User) list.get(i);                        

         session.save(user)                  

                if (i % 20 == 0) {     

         session.flush();        

      session.clear(); } 
                       } 

                       ts.commit(); } catch (Exception e) { 
                       if (ts != null) { ts.rollback(); } 
    } finally { 
                       HibernateSessionFactory.closeSession(); }      

     3 更新 

           在hibernate中,更新对象前不需要使用查询语句:update…,一般需要在取得需要更新的持久化对象后,执行Session对象的update(…)方法。例如: 
    Session session = HibernateSessionFactory.getSession(); Transaction ts = null; try { 
    ts = session.beginTransaction(); //取得持久化对象 
                       User user = session.get(User.class, "amigo");                    //对需要修改的属性进行修改                    user.setFullName("阿蜜果");                    …… 
                       session.update(user)                     ts.commit(); } catch (Exception e) { 
                       if (ts != null) { ts.rollback(); } 
    } finally { 
                      HibernateSessionFactory.closeSession(); }    

       4 删除 
    4.1删除单个对象 

           一般在取得某对象后,开发人员可以调用Session对象的delete(…)方法删除该对象。 Eg. 下面的实例中取得loginName(主键)为“amigo”的User对象后,将它删除。 Session session = HibernateSessionFactory.getSession(); Transaction ts = null; try { 
    ts = session.beginTransaction(); //取得持久化对象 
                       User user = session.get(User.class, "amigo");                    session.delete(user)                     ts.commit(); } catch (Exception e) { 
                       if (ts != null) { ts.rollback(); } 
    } finally { 
                       HibernateSessionFactory.closeSession(); } 
    4.2批量删除对象 
    对于批量删除对象的情况,开发人员可以在取得待删除的对象列表后,一个一个的将对象删除,对于每个对象的删除方法,见3.4.1小节。开发人员还可以hql语句来做批量删除。 
    Eg. 该实例通过delete语句来删除记录,除了loginName为“amigo”的对象为,其余都删除,代码如下所示: 
    Session session = HibernateSessionFactory.getSession(); Transaction ts = null; try { 

    ts = session.beginTransaction(); 
    String hql = "delete User as user where user.loginName != 'amigo'"; Query query = session.createQuery(hql); int count = query.executeUpdate(); ts.commit(); 
    System.out.println("delete count : " + count); //删除条数 } catch (Exception e) { 
                       if (ts != null) { ts.rollback(); } 
    } finally { 
                       HibernateSessionFactory.closeSession(); }

  • 相关阅读:
    Mvc+三层(批量添加、删除、修改)
    js中判断复选款是否选中
    EF的优缺点
    Git tricks: Unstaging files
    Using Git Submodules
    English Learning
    wix xslt for adding node
    The breakpoint will not currently be hit. No symbols have been loaded for this document."
    Use XSLT in wix
    mfc110ud.dll not found
  • 原文地址:https://www.cnblogs.com/xuehen/p/4434265.html
Copyright © 2011-2022 走看看