Hibernate的检索方式(上)

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();//执行查询结果

QBE方式:一般只用于匹配对象,对于一些条件的查询就不行了。
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()

5.设置注解
       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中调用函数

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值