【hibernate进阶】hql简单属性查询
翻开之前的博客,距离最开始写hibernate进阶专栏的第一篇博客开始,已经有八个多月了,因为最近做的项目在用hql,所以继续完善这个专栏.在今天主要分享hql的简单属性查询,通过查询单个属性和通过五种不同的查询方式来讲解.
1.hql单个属性查询
首先新建一个Student的JavaBean.
package com.hqlquery.hibernate; import java.util.Date; public class Student { private int id; private String name; private Date createTime; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Date getCreateTime() { return createTime; } public void setCreateTime(Date createTime) { this.createTime = createTime; } }
hql的单个属性查询的hql语句和sql语句查询单个属性类似,hql语句查询时使用的单个属性与JavaBean中的字段一致,sql语句查询时使用的单个属性与数据库表字段一致.语句都是select 字段名 from 表名
package com.hibernate.hibernate; import java.util.Iterator; import java.util.List; import org.hibernate.Session; import junit.framework.TestCase;
public class SimplePropertyQueryTest extends TestCase { //hql单个属性查询 public void testQuery(){ Session session=null; try{ session=HibernateUtils.getSession(); session.beginTransaction(); List students=session.createQuery("select name from Student").list; for(Iterator iter=student.iterator();iter.hasNext();){ String name=(String)iter.next(); System.out.println(name); } session.getTransaction().commit(); }catch(Exception e){ e.printStackTrace(); session.getTransaction().commit(); }finally{ HibernateUtils.closeSession(session); } }
2.hql多个属性查询
返回entity
返回entity的时候,需要提供构造函数,例如查询时使用的属性是id和name,那么则需要提供相应的构造函数.
public Student() { } public Student(int id, String name) { this.id = id; this.name = name; }在写测试类的时候,只需要将hql语句和返回的类型修改即可.
//hql多个属性查询,返回student public void testQuery(){ Session session=null; try{ session=HibernateUtils.getSession(); session.beginTransaction(); //可以使用hql返回student对象,需要提供构造函数 List students=session.createQuery("select new Student(id,name) from Student").list; for(Iterator iter=student.iterator();iter.hasNext();){ Student student=(Student)iter.next(); System.out.println(student.getId()+","+student.getName()); } session.getTransaction().commit(); }catch(Exception e){ e.printStackTrace(); session.getTransaction().commit(); }finally{ HibernateUtils.closeSession(session); } }
返回object
//hql多个属性查询,返回对象数组 public void testQuery(){ Session session=null; try{ session=HibernateUtils.getSession(); session.beginTransaction(); //查询多个属性,返回对象数组集合 //数组元素的类型与查询的属性类型一致 //数组的长度与select中查询的属性个数一致 List students=session.createQuery("select id,name from Student").list; for(Iterator iter=student.iterator();iter.hasNext();){ Object[] obj=(Object[])iter.next(); System.out.println(obj[0]+","+obj[1]); } session.getTransaction().commit(); }catch(Exception e){ e.printStackTrace(); session.getTransaction().commit(); }finally{ HibernateUtils.closeSession(session); } }
使用别名
使用别名查询的时候有两种形式,使用as别名和不使用as别名.
1.不使用as别名
select s.id, s.name from Student s
//hql多个属性查询,返回student public void testQuery(){ Session session=null; try{ session=HibernateUtils.getSession(); session.beginTransaction(); //可以使用as别名 List students=session.createQuery("select s.id,s.name from Student s").list; for(Iterator iter=student.iterator();iter.hasNext();){ Student student=(Student)iter.next(); System.out.println(student.getId()+","+student.getName()); } session.getTransaction().commit(); }catch(Exception e){ e.printStackTrace(); session.getTransaction().commit(); }finally{ HibernateUtils.closeSession(session); } }
2.使用as别名
select s.id, s.name from Student as s
//hql多个属性查询,返回student public void testQuery(){ Session session=null; try{ session=HibernateUtils.getSession(); session.beginTransaction(); //可以使用as别名 List students=session.createQuery("select s.id,s.name from Student as s").list; for(Iterator iter=student.iterator();iter.hasNext();){ Student student=(Student)iter.next(); System.out.println(student.getId()+","+student.getName()); } session.getTransaction().commit(); }catch(Exception e){ e.printStackTrace(); session.getTransaction().commit(); }finally{ HibernateUtils.closeSession(session); } }
总结:
简单属性查询
* 单一属性查询,返会属性结果集列表,元素类型和实体类中相应的类型一致
* 多个属性查询,多个属性查询返会对象数组,对象数组的长度取决于属性的个数
对象数组中元素的类型取决于属性在实体类中的类型
* 如果认为返会数组不够对象化,可以使用hql动态实例化Student对象