hql和sql的區(qū)別

hql和sql的區(qū)別

hql是面向?qū)ο蟮?。其實(shí)還是轉(zhuǎn)成了sql語句hql在數(shù)據(jù)庫通用,切換數(shù)據(jù)庫方言就可以sql在不同數(shù)據(jù)庫中語法有些不同還是sql比較靈活一些。

HQL(Hibernate Query Language)查詢提供了更加豐富的和靈活的查詢特性,因此Hibernate將HQL查詢方式立為**推薦的標(biāo)準(zhǔn)查詢方式,HQL查詢在涵蓋 Criteria查詢的所有功能的前提下,提供了類似標(biāo)準(zhǔn)SQL語句的查詢方式,同時(shí)也提供了更加面向?qū)ο蟮姆庋b。

hql和sql的區(qū)別是什么

hql是面向?qū)ο蟛樵兊?sql是面向數(shù)據(jù)庫做查詢。hql的語法結(jié)構(gòu):from+類名+類對象+where+類對象屬性的條件;sql的語法結(jié)構(gòu):from+數(shù)據(jù)庫表名+where+表字段條件。

新增:hql不需要再用insert語句,只需構(gòu)造新增對象后調(diào)用save()方法。

修改:hql不需要再用update語句,只需得到修改對象后調(diào)用update()方法。刪除:hql不需要再用delete語句,只需得到要刪除的對象后調(diào)用delete()方法。

淺談hql和sql的區(qū)別,描述特別需要注意的地方

1.hql與sql的區(qū)別sql 面向數(shù)據(jù)庫表查詢hql 面向?qū)ο蟛樵僪ql : from 后面跟的 類名+類對象 where 后 用 對象的屬性做條件sql: from 后面跟的是表名 where 后 用表中字段做條件查詢 在Hibernate中使用查詢時(shí),一般使用Hql查詢語句。HQL(Hibernate Query Language),即Hibernate的查詢語言跟SQL非常相像。

不過HQL與SQL的最根本的區(qū)別,就是它是面向?qū)ο蟮摹?/p>

使用HQL時(shí)需要注意以下幾點(diǎn):l 大小寫敏感因?yàn)镠QL是面向?qū)ο蟮?,而對象類的名稱和屬性都是大小寫敏感的,所以HQL是大小寫敏感的。Eg.HQL語句:from Cat as cat where cat.id > 1;與from Cat as cat where cat.ID > 1;是不一樣的,這點(diǎn)與SQL不同。l from子句Eg. from Cat,該句返回Cat對象實(shí)例,開發(fā)人員也可以給其加上別名,eg. from Cat as cat,對于多表查詢的情況,可參考如下:from Cat as cat, Dog as dog其它方面都與SQL類似,在此不再贅述。接下來講一個(gè)在Hibernate中查詢的例子。

1.1簡單查詢List list = session.createQuery(\”from User as user order by user.loginName\”).list();1.2帶單個(gè)參數(shù)的查詢List list = session.find(\”from User as user where user.loginName=?\”, loginName, Hibernate.STRING);1.3多個(gè)參數(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ù)量的查詢這種一般是在記錄需要分頁的時(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語句來查詢,因?yàn)檫@將破壞數(shù)據(jù)庫的易移植性,但是Hibernate中也提供了使用原生SQL進(jìn)行查詢的方法,只需要獲得連接即可。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新增單個(gè)對象 新增單個(gè)對象的實(shí)例如下,該實(shí)例將在用戶表中新增一條記錄。

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個(gè)對象時(shí)手動的flush一次,假設(shè)在list為一個(gè)用戶列表,里面包含很多User對象,那么要將實(shí)現(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\”); //對需要修改的屬性進(jìn)行修改 user.setFullName(\”阿蜜果\”); …… session.update(user) ; ts.commit();} catch (Exception e) { if (ts != null) {ts.rollback();}} finally { HibernateSessionFactory.closeSession();}4 刪除4.1刪除單個(gè)對象 一般在取得某對象后,開發(fā)人員可以調(diào)用Session對象的delete(…)方法刪除該對象。Eg. 下面的實(shí)例中取得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ā)人員可以在取得待刪除的對象列表后,一個(gè)一個(gè)的將對象刪除,對于每個(gè)對象的刪除方法,見3.4.1小節(jié)。開發(fā)人員還可以hql語句來做批量刪除。

Hibernate的HQL和sql有什么區(qū)別?

hql是面向?qū)ο蟮倪@是主要區(qū)別就是hql操作的對象不再是表了而是實(shí)體類這樣就把面向?qū)ο蟮囊恍┨攸c(diǎn)弄進(jìn)來了比如班級類里面有很多學(xué)生from班級where學(xué)生.性別=“男”如果是sql的話就需要鏈表查詢這樣很麻煩不是每一個(gè)程序員都是如同數(shù)據(jù)庫管理員一樣的。