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<School> schools = new ArrayList<School>();
	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类型为一个对象,如下图:

所以可以将Object对象转化为School对象,代码正常运行。

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

该异常为类型不匹配异常,我们可以再看看Object对象里的内容,如下图:

从程序中可以看出来,这时候返回的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<School> schools = new ArrayList<School>();
	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语句返回的对象不能封装,所以是一个对象数组



  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值