hibernate中的hql语句加select字段与不加的区别

hibernate框架中有属于自己的hql查询语言,hql语句与sql语句的区别是:

hql语句中from后面的不代表表名(不区分大小写),而代表类名(区分大小写)。

下面通过一个例子说明加select字段与不加的区别:

先在数据库中创建一个表,这里创建的是school表,其中有两个字段,sid和sname,创建表的语句如下:

create table school (

sid number(6) not null,

sname varchar2(30),

constraint PK_SCHOOL primary key (sid)

);

在web工程中通过hibernate的反向工程创建School实体类,编写一个程序,读出数据库中的所有数据;

以下是不加select字段的程序:

public static void main(String[] args) {
	Session session = HibernateSessionFactory.getSession();//连接数据库
	String hql = " from School ";
	Query query = session.createQuery(hql);
	List list = query.list();
	List schools = new ArrayList();
	for (Object obj : list){
		School s = (School) obj;
		schools.add(s);
	}
	session.close();
	for (School s : schools){
		System.out.println(s.getSid() + "....." + s.getSname());
	}
	session.close();
}

执行后可以看到object类型为一个对象,如下图:
hibernate中的hql语句加select字段与不加的区别_第1张图片
所以可以将Object对象转化为School对象,代码正常运行。

如果将上面的hql语句改为“select sid , sname from School”,程序抛出异常,如下图:

该异常为类型不匹配异常,我们可以再看看Object对象里的内容,如下图:
hibernate中的hql语句加select字段与不加的区别_第2张图片
从程序中可以看出来,这时候返回的Object 对象为一个数组,所以不能转化为School对象。

下面给出加上select字段的程序:
public static void main(String[] args) {
	Session session = HibernateSessionFactory.getSession();
	String hql = " select sid, sname from School ";
	Query query = session.createQuery(hql);
	List list = query.list();
	List schools = new ArrayList();
	for (Object obj : list){
		Object[] objs = (Object[]) obj;
		School s = new School();
		s.setSid((Integer) objs[0]);
		s.setSname((String) objs[1]);
		schools.add(s);
	}
        session.close();
	for (School s : schools){
		System.out.println(s.getSid() + "....." + s.getSname());
	}
}
由于加上select字段后,结果返回的是一个对象数组,所以必须把对象数组里的数据一个一个赋值给School的属性,并且对象数组里的顺序与select字段后面的列名顺序一一对应,例如:把hql语句改为:
String hql = " select sname , sid from School ";
那么下面的赋值语句应相应的改为:
s.setSname((String) objs[0]);
s.setSid((Integer) (objs[1]));

附:没有select语句返回的对象会根据from后面的类去封装,而有select语句返回的对象不能封装,所以是一个对象数组



你可能感兴趣的:(Hibernate框架)