Hibernate 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();

}
摘抄:http://hi.baidu.com/execoo/blog/item/8ae002eaf2cee9d8d539c907.html


注:
1、當hql語句中只查詢一個字段的時候、返回Object對象(好像是根據你的字段類型來決定返回什么類型、比如我只查詢id(我的id在數據庫中的類型為number、在javaBean屬性文件中定義的是Long)這個時候它會返回一個Long類型):個人覺得應該是根據你的javaBean屬性文件中定義的類型來決定的、如果是Long就返回Long如果是String就返回String(用javaBean對象接收list集合中的數據會報錯)。

2、當hql語句中只查詢兩個字段、或者兩個字段以上的時候、返回Object[]數組類型(這個不能用你的javaBean對象接收list集合中的數據、這樣接收list中的數據就會報錯。要用一個Object[]來接收。)

3、當Hibernate中使用原生態sql語句查詢時(select *)返回Object[]如果將list集合中的Object[]數據轉換成javaBean就會報錯!

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com