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]));