|
1.hql與sql的區(qū)別 sql 面向數(shù)據(jù)庫表查詢 hql 面向?qū)ο蟛樵?/p> hql : from 后面跟的 類名+類對象 where 后 用 對象的屬性做條件 sql: from 后面跟的是表名 where 后 用表中字段做條件 查詢 在Hibernate中使用查詢時,一般使用Hql查詢語句。 HQL(Hibernate Query Language),即Hibernate的查詢語言跟SQL非常相像。不過HQL與SQL的最根本的區(qū)別,就是它是面向?qū)ο蟮摹?/p> 使用HQL時需要注意以下幾點: l 大小寫敏感 因為HQL是面向?qū)ο蟮?,而對象類的名稱和屬性都是大小寫敏感的,所以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對象實例,開發(fā)人員也可以給其加上別名,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帶單個參數(shù)的查詢 List list = session.find("from User as user where user.loginName=?", loginName, Hibernate.STRING); 1.3多個參數(shù)的查詢 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查詢數(shù)量 int count = (Integer) session.createQuery("select count(*) from User").uniqueResult().intValue(); 1.5限制查詢起始值和數(shù)量的查詢 這種一般是在記錄需要分頁的時候需要用到,例如,在如下的代碼中,限制查詢的開始記錄的位置為50,最大查詢條數(shù)為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為用戶與角色關(guān)聯(lián)對象。如下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查詢 對于某些復(fù)雜的查詢語句,需要調(diào)用某種特定的數(shù)據(jù)庫的特定函數(shù)才能解決,Hibernate雖然不推薦使用原生SQL語句來查詢,因為這將破壞數(shù)據(jù)庫的易移植性,但是Hibernate中也提供了使用原生SQL進行查詢的方法,只需要獲得連接即可。 Eg. 在下面的例子中,用到了Sql Server數(shù)據(jù)庫中的原生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 新增 在數(shù)據(jù)庫中新增記錄在Hibernate中不需要使用insert命令,只需要構(gòu)造新增的對象后,調(diào)用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一次,假設(shè)在list為一個用戶列表,里面包含很多User對象,那么要將實現(xiàn)這些對象的批量新增,可采用如下方法: 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…,一般需要在取得需要更新的持久化對象后,執(zhí)行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刪除單個對象 一般在取得某對象后,開發(fā)人員可以調(diào)用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批量刪除對象 對于批量刪除對象的情況,開發(fā)人員可以在取得待刪除的對象列表后,一個一個的將對象刪除,對于每個對象的刪除方法,見3.4.1小節(jié)。開發(fā)人員還可以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); //刪除條數(shù) } catch (Exception e) { if (ts != null) { ts.rollback(); } } finally { HibernateSessionFactory.closeSession(); } |
|
|