hql语句就可以理解成hibernate中的sql语句。所以要想学习hql就必须有表作为支持。下面是这次博客所用到的三张表。(其三张表的关系就是:学生表和课表是多对多的关系,然后通过建立中间表即学生选课信息表将其多对多的关系分成了一对多和多对一的关系)
1.检索表中全部数据(对象中所有属性)(例如在学生表中检索出所有的学生):
public static void main(String[] arggs){
Configuration configuration = new Configuration( ).configure( );//将配置文件的信息读给Configuration对象
SessionFactory factory = configuration.buildSessionFactory( );//得到session工厂
Session session = factory.openSession( );//从session工厂中得到session
Transaction transaction = session.beginTransaction( );//开启事务
Query query = session.createQuery("from Student");//Student是表所对应的类 sid sname是表中的属性
List<Student> list = query.list();
transaction.commit();//提交事务
session.close();//关闭session会话
}
其中Student是数据库中student表所对应的类
现在所有与student表中每一行数据相对应的类的对象已经存入了List集合里面。通过遍历集合就可以将其中的数据取出
2.检索整个表中部分字段(对象中所有属性)的数据:
原则:在JDBC中要查询什么字段就查什么字段,不要把所有字段都查出来(selecct ... from ...)。但是在hibernate中我们不遵循这个规则。否则体现不到它的优势,它建议我们把表中所有的字段(对象中所有属性)都查出来。其实这个有两种方法:
1)把所有的属性都查出来,只显示所想看到的属性(数据库中的字段);
2)只把需要的属性(数据库表中的字段)查出来并显示然而hibernate建议我们使用第一种方法
例如在学生表中查询出所有学生的学号和姓名( 使用第2种方法:只将类中自己想要的属性查询出来):
Query query = session.createQuery("select sid,sname from Student");//Student是表所对应的类sid sname是表中的属性
List<Student> list = query.list();
以上代码运行会报错,因为当你只从表中查询出来sid sname的话,它默认的是它们还无法构成一个Student对象,所以就不能够和检索表中所有数据时那样直接在list集合加上Student泛型,应该用以下方法:
Query query = session.createQuery("select sid,sname from Student");
List list = query.list();//这里不可以加Student类的泛型
//取出list集合中的数据
for(int i = 0; i<list.size();i++){
Object[] object = (Object[]) list.get(i);
System.out.println(object[0].toString() +" "+object[1].toString());
}
为什么查询全表部分字段信息的时候要用上面这种方法呢?由下图可知,如果查询的不是类中全部的属性或者说不是表中全部的字段的话,query.list()返回的集合中存储的并不是相对应的Student类对象,而是Object[ ] 数组
为什么不建议用这种方法?
因为hibernate中,完全是对对象进行操作的思想,而返回的不是Student类对象就会与这个思想相违背。如果与hibernate框架的设计思想想违背的话,以后会对开发造成很多的不便。因为你没有办法使用hibernate提供给你的一些便捷