最近看到一個簡單的關於HQL語句的介紹,其中大部份內容都有了解,但在查詢後獲得的結果集封裝這一塊倒是沒怎麼涉及,因此仔細看了,作了下筆記。如今總結一下。java
1、關於查詢結果集封裝session
public class UserInfo implements Serializable { private Integer id; private String username; private Integer age; private String cellphone; private String address; private Data createTime; public UserInfo(){} //此處省略各字段get、set方法 }
第一種,正常的字段結果集。例子以下:框架
private Session ssession = HibernateSessionFactory.getCurrentSession(); String hql = "select u.username,u.age,u.cellphone from UserInfo u"; Query query = session.createQuery(hql); List<Object[]> list = query.list(); for(Object[] object : list){ Sysout.out.println("username:"+objcet[0]); Sysout.out.println("age:"+objcet[1]); Sysout.out.println("cellphone:"+objcet[2]); }
注:特別注意,當查詢結果只有一個屬性字段時,不能依葫蘆畫瓢的用List<Object[]> 獲取結果集後經過object[0]獲取,而是用List<Object> list = query.list(); 來獲得指定的惟一字段。this
第二種,使用util包的List集合封裝結果集。例子以下:spa
private Session ssession = HibernateSessionFactory.getCurrentSession(); String hql = "select new list(u.username,u.age,u.cellphone) from UserInfo u"; Query query = session.createQuery(hql); List<List> list = query.list(); for(List list : list){ Sysout.out.println("username:"+list.get(0)); Sysout.out.println("age:"+list.get(1)); Sysout.out.println("cellphone:"+list.get(2)); }
第三種,使用util包的Map集合封裝結果集。例子以下:code
private Session ssession = HibernateSessionFactory.getCurrentSession(); String hql = "select new map(u.username as name,u.age as age,u.cellphone as phone) from UserInfo u"; Query query = session.createQuery(hql); List<Map> list = query.list(); //遍歷結果方法一 for(Map map : list){ Sysout.out.println("username:"+map.get("0")); Sysout.out.println("age:"+list.map.get("1")); Sysout.out.println("cellphone:"+map.get("2")); } //遍歷結果方法一 for(Map map : list){ Sysout.out.println("username:"+map.get("name")); Sysout.out.println("age:"+map.get("age")); Sysout.out.println("cellphone:"+map.get("phone")); }
從例子中能夠看到map還能夠經過給屬性字段定義別名的形式來封裝map,以方便結果遍歷。對象
第四種,使用自定義對象封裝結果集。例如剛纔的UserInfo對象,在咱們不特定指出獲取個別字段或者顯性獲取字段的狀況下框架是會自動將封裝成對象返回的,然而咱們也能夠根據本身的須要將特定的字段封裝成對象,例子以下:get
在UserInfo對象中添加帶參構造方法io
public UserInfo(String username,Integer age,String cellphone){ this.username = username; this.age = age; cellphone = cellphone; }
private Session ssession = HibernateSessionFactory.getCurrentSession(); String hql = "select new UserInfo(u.username,u.age,u.cellphone) from UserInfo u"; Query query = session.createQuery(hql); List<UserInfo> list = query.list(); for(UserInfo userInfo : list){ Sysout.out.println("username:"+userInfo.getUsername()); Sysout.out.println("age:"+userInfo.getAge()); Sysout.out.println("cellphone:"+userInfo.getCellphone()); }
注意:原先的無參構造器必須保留。class
2、部分運算符的使用
一、「between 值1 and 值2 」的範圍運算是包含邊界值的。
二、null 值判斷有兩種方式。「u.username is not null 」等價於「u.username <> null」。(框架會自動解析成數據能夠識別的null判斷語句)
三、關於uniqueResult方法。只容許查詢結果返回一個結果或者沒有結果,放返回結果數超過一個時會拋出異常。例子以下
private Session ssession = HibernateSessionFactory.getCurrentSession(); String hql = "from UserInfo u where u.id = 1"; Query query = session.createQuery(hql); UserInfo userInfo = (UserInfo)query.uniqueResult(); Sysout.out.println("username:"+userInfo.getUsername());