【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对象


posted @ 2017-02-03 21:04  陈晓婵  阅读(485)  评论(0编辑  收藏  举报