最近看到一个简单的关于HQL语句的介绍,其中大部分内容都有了解,但在查询后得到的结果集封装这一块却是没怎么涉及,所以仔细看了,做了下笔记。现在总结一下。
一、关于查询结果集封装
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(); 来得到指定的唯一字段。
第二种,使用util包的List集合封装结果集。例子如下:
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集合封装结果集。例子如下:
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对象,在我们不特定指出获取个别字段或者显性获取字段的情况下框架是会自动将封装成对象返回的,然而我们也可以根据自己的需要将特定的字段封装成对象,例子如下:
在UserInfo对象中添加带参构造方法
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());
}
注意:原先的无参构造器必须保留。
二、部分运算符的使用
1、“between 值1 and 值2 ”的范围运算是包含边界值的。
2、null 值判断有两种方式。“u.username is not null ”等价于“u.username <> null”。(框架会自动解析成数据可以识别的null判断语句)
3、关于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());