一,"from (类名称)"
类名称:持久化类的配置文件(*.hbm.xml)中,<class name="..">中name的值
使用:Query query=session.createQuery("from domain.Student");
效果:把数据库中Student对应的表 中数据全部提取出来
二,"select (属性名称) from (类名称)"
属性名称:持久化类的配置文件(*.hbm.xml)中,<property name="..">中name的值
类名称:持久化类的配置文件(*.hbm.xml)中,<class name="..">中name的值
使用:select name from domain.Student
效果:获取表中的某一字段的所有值,注意获取的类型对应表中数据的类型,如果表中字段类型为varchar,那么获取到的类型就是String,如果表中字段为int,获取的类型就是Integer
(2.1) “select (属性名称,属性名称, ...) from (类名称)”
ps:可以看出,把每一条记录都封装成了一个Object[] 类型的对象
那么获取当然需要这样了:
三,“select new (构造函数) from 类名称” (弥补了2.1中O bject[]类型操作的不便利性)
构造函数:持久类中的构造函数
类名称:持久化类的配置文件(*.hbm.xml)中,<class name="..">中name的值
使用:
(1)给持久类增加构造函数
public Student(){} public Student(String name,String sex){ this.name=name; this.sex=sex; }
(2)使用
发现:相对于获得一个object[]数组,操作的不便利,这种封装成持久类对象更容易我们操作,还有就是如果不需要id数据,我们发现并没有查询id数据
四,“select 聚合函数(属性名称) from 类名称 ”
对于这种聚合函数获得结果集而言,数据只有一条,显然放在List中有些大题小做了,
uniqueResult()方法来代替list()方法,并且返回的结果不再是List类型而是Long类型
Query query=session.createQuery("select count(name) from domain.Student"); Long num=(Long)query.uniqueResult(); System.out.println(num);
二级缓存相关:
回头看看session.createQuery(); 发现我们查询出来有的时候是Object[]类型,有的是Long类型,各种类型。二级缓存只能存储持久化对象,所以像我们这些方式查询出来的数据都不能放入二级缓存中
Query query=session.createQuery("select id,name from domain.Student");
Query query=session.createQuery("select new domain.Student(name) from domain.Student");//虽然集合中装的是持久化类型类型,但不是完整的持久化对象
Query query=session.createQuery("select count(name) from domain.Student");
以上查询出来的数据放进不了二级缓存中
Query query=session.createQuery("from domain.Student");
只有该方法把查询出来的数据放进了二级缓存