1.HQL检索方式
HQL和SQL语句相似,是hibernate中使用最广的一种方式。
Query query = session.createQuery("from aaa(类名字) as a where a.name=:name and a.age=:age");//先创建一个Query对象,包含HQL语句
query.setString("name","wwww");//设定参数,返回自身实例
query.setInteger("age",12);//设定参数,返回自身实例
List result = query.list();//执行查询语句返回结果,结果为持久化对象。
HQL和SQL的区别在于,HQL是面向对象的,Hibernate解析HQL语句根据映射文件来解析成SQL语句,所以HQL的主体是类和类属性,上面的aaa是类的名字,a.name是aaa的属性名。sql语句的主体是数据库的表和表字段。
2.QBC检索方式
Criteria c = session.createCriteria(aaa.class);//创建criteria对象
Criterion c1 = Restrictions.like("name","T%");//设定参数
Criterion c1 = Restrictions.eq("age",new Integer(21));//设定参数
c.add(c1);//返回自身实例
c.add(c2);//返回自身实例
List result = c.list();//执行查询结果
AAA a = new AAA();
A.setAge(12);
List result = session.createCriteria(AAA.class)
.add(Example.create(a)).list();
3.本地SQL检索方式
Query query = session.createSQLQuery("select * from AAA(数据库表) as a where a.name=:name and a.age=:age");//先创建一个Query对象,包含SQL语句
query.setString("name","wwww");//设定参数,返回自身实例
query.setInteger("age",12);//设定参数,返回自身实例
List result = query.list();//执行查询语句返回结果,结果为持久化对象。
1.使用别名
最简单的查询一个持久化类的实例:
List result = session.createQuery("from aaa").list();
List result = session.createCriteria(aaa.class).list();
HQL如果查询语句其他地方需要引用到,要用别名,用as来指定,as可以省略。QBC不需要使用别名。
2.多态查询
多态查询表示查询当前类及其子类。
session.createQuery("from aaa")
session.createCriteria(aaa.class)
HQL的from Object会查询所有持久化对象,对接口也适用,表示查询所有实现了这个接口的实例,还会对关联的类也进行多态查询。
3.对查询结果进行排序
session.createQuery("xxxx order by xxx desc,id asc")
session.createCriteria(xxx.class).addOrder(Order.asc("name")).addOrder(Order.desc("age"));
4.分页查询
session.createQuery("xxxx order by xxx desc,id asc").setFirstResult(0).setMaxResults(10);
session.createCriteria(xxx.class).addOrder(Order.asc("name")).addOrder(Order.desc("age")).setFirstResult(12).setMaxResults(12);
HQL和QBC两种方式都有setFirstResult(int)和setMaxResults(int):
1.setFirstResult(int)从哪个索引位置开始,第一个位置为0。
2.setMaxResults(int)一次查询多少条记录。
5.检索单个对象
list()返回一个list集合结果,uniqueResult():返回单个对象。如果知道返回的是一个对象,就不用setMaxResults(1),不然如果查询有多个,而且没有设置setMaxResults(1),那么uniqueResult()方法会报NonUniqueResultException.
6.按主键逐个处理查询结果(iterate)
list()方法查询的是所有字段,iterate()方法查询的是id字段
Iterator a = session.createQuery(xxxx).iterate();
while(a.hasNext()){
A bb = (A)a.next();//这里会从session中查询,没有再从数据库查询
}
一下情况Iterator会关闭:遍历完了,session关闭,HIbernate.close(itertor对象)
7.可滚动的结果集
scroll()方法返回ScrollableResults。
first():游标到第一行
last():游标到最后一行
beforeFirst()游标到第一行之前//返回void
afterLast()游标到最后一行之后。//返回void
previous():游标向前移动一行
next()游标向后移动一行。
scroll(int n)相对于当前位置移动n行,n>0表示向后,n<0表示向前。
setRowNumber(int n)移动到行号为n的行,行号从0开始。
除了两个方法返回void,其他方法都返回boolean,如果移动到那哪行有数据,就返回true,否则false。
scroll()方法还有参数:
1:ScrollMode.FORWARD_ONLY:只能上下移动,不能滚动,默认值。
2.ScrollMode.SCROLL_INSENSITIVE:可以上下移动,可以滚动,程序对结果集做修改,不敏感。
3.ScrollMode.SCROLL_SENSITIVE:对修改敏感,比如删除一条记录时,游标会发生变化。
这个跟jdbc好像一样。
8.在HQL查询语句中绑定参数
session.createQuery("xxx name='"+name+"')
上面这种可以但是不安全,比如name为 tom' and some() and age=12这样子就会出问题。而参数绑定就没有这种问题,而且参数绑定还能够预编译,只要执行的时候传几个参数就行了,不会重新编译。
1.按参数名绑定
session.createQuery("xxx c where c.name=:name and age=:age").setString("name","hello").setInteger("age",12)
2.按参数位置绑定
session.createQuery("xxx c where c.name=? and age=?").setString(0,"hello").setInteger(1,12)
按照名字绑定的优势:
1.程序代码的可读性强
2.有利于维护,按位置绑定的位置变了,就必须改变绑定的程序。
3.按名字绑定的参数可以出现多次。
setBinary()
setBoolean()
setByte()
setString()
setDouble()等等
以上都有两种重载方式一种按名字,一种按位置
1.setEntity():把参数和持久化类的实例绑定
A a = new A();
B b = new B();//b中有参数A
session.createQuery("from B bb where bb.a = :a").setEntity("a",a)//这是按照a的OID查询
2.setParameter():绑定任意参数
更上面差不多,第三个参数显示表示映射类型。
3.setProperties():把参数和一个对象的属性绑定
9.设置查询附属事项
1.设置清理缓存模式
setFlushMode()有三种类型,FlushMode.Auto(默认)在查询,commit,flush是清理。FlushMode.Commit在commit和flush时清理,FlushMode.NERVER在flush时清理。
2.设置session和二级缓存交互模式
setCacheMode()5中模式,CacheMode.NORMAL,CacheMode.IGNORAL,CacheMode.GET,CacheMode.put,CacheMode.REFRESH。
3.设置执行超时时间
setTimeout()
4.设置批量抓取数目
setFetchSize()
setComment()
6.设置查询结果是否只允许读
setReadOnly(true)
10.在映射文件中命名定义查询语句
和<class>同级<query>
<query name="aaa"//引用这个名字就行,session.getNamedQuery(aaa)
cache-mode=""
timeout=""
comment
>
<![CDATA[ 语句]]>
</query>
<sql-query name="">//sql语句,也是session.getNamedQuery()
<return alias="c" class=""/>
sql语句
</sql-query>
还可以在HQL中调用函数