当前位置:编程学习 > JAVA >>

Hibernate数据查询

•       HQL:Hibernate查询语言,它是Hibernate提供的一种面向对象的查询语言。
 
 (1)在查询语句中设定各种查询条件
 
 (2)支持动态绑定参数
 
(3)支持投影查询、分页查询、连接查询、分组查询,子查询
 
(4) 内置了一些聚集函数
 
 二.HQL
 
Hibernate中的Query接口就是专门用来执行HQL语句的查询接口。
 
1.创建查询对象
 
Query query=session.createQuery(“fromDept”);
 
2.执行查询列出结果
 
  1)列出所有的结果
 
List<Dept> depts=query.list();
 
for(Dept dept:depts){…}
 
•       2)列出单个结果
 
Query query=session.createQuery(“from Deptwhere id=1”);
 
 query.setMaxResults(1);
 
 Dept dept=(Dept)query.uniqueResult();
 
3)迭代访问结果
 
Iterator<Dept> it=query.iterate();
 
While(it.hasnext()){
 
}
 
HQL 基本语法:持久化类名区分大小写
 
1)选择要查询的持久化类。
 
  String hql=“from Dept”
 
 Query query=session.createQuery(hql);
 
 String hql=“from Dept as d”;
 
2)投影查询
 
String hql="select id,name fromDept";
 
Query query=session.createQuery(hql);
 
List list=query.list();
 
intsize=list==null?0:list.size();
 
for(inti=0;i<size;i++){
 
    Object[] obj=(Object[])list.get(i);
 
      System.out.println(obj[1]+“  ”+obj[2]);
 
}
 
•       针对选定属性创建一个类,提供以这两个属性为参数的构造方法,使用此类来封装查询结果。
 
 
 
3)where 条件子句
 
•       String hqlString="from Dept d whered.createdTime>='2010-01-01'";
 
•       Query query=session.createQuery(hqlString);
 
•       String hqlString="from Dept d where d.name like'java%' andd.employees is not empty and d.createdTime<current_date()";
 
•       绑定查询参数:
 
•       按参数名字绑定
 
•       String hql=“from  Dept whereid>:id and name like:likeName”
 
•       List<Dept> depts=session.createQuery(hql).setLong(“id”,newLong(ingputID)).setString(“likeName”,”%”+inputName+”%”).list();
 
•       按参数位置绑定
 
•       5)distinct 过滤重复值
 
•       Select distinct createTime from Dept
 
•       6)聚集函数
 
•        select count(d) from Dept d
 
•       7)order by 排序
 
•       From Dept d order by d.createdTime asc,d.name desc
 
•       8)group by 对记录分组
 
•       Select count(e) from Employee e group by e.dept;
 
•       9)having 对分组后数据进行条件过滤
 
•       Select e.dept.name from Eployee e group by e.dept havingcount(e)>1
 
分页查询
 
Query接口提供两个用于分批显示查询结果的方法
 
setFirstResult(intfirstResult):在记录集中从第几条记录开始取数据。默认是0。
 
setMaxResults(intmaxResults):设置每次查询返回的最大对象数。
 
session.beginTransaction();
 
String hql ="from Employee";
 
List<Employee>empls =  session.createQuery(hql)
 
                   .setMaxResults(pageSize)
 
                   .setFirstResult((pageNo - 1)* pageSize)
 
                   .list();
 
session.getTransaction().commit();
 
批量修改和删除:直接通过SQL语句操作数据库,执行完后,当前session缓存中的数据与数据库中的数据不是同步的。
 
Stringhql=“delete Dept as d where d.name like:likeName”;
 
Queryquery=session.createQuery(hql).setString(“likeName”,”%三%”);
 
int count=query.executeUpdate();
 
连接查询
 
•       Inner join                  left outer join   
 
•       Right outer join         fulljoin
 
String hql ="FROM Dept d JOIN d.employees e "
 
 + " WHERE d.name LIKE :likeName";
 
抓取连接查询  fetch
 
抓取:是指从数据库加载一个对象数据时,同时把它所关联的对象和集合的数据一起加载出来,以便减少SQL语句的数据,从而提高查询效率。
 
From Dept d leftjoin Fetch d.employees e where d.name like “%web%”
 
子查询
 
From Dept dwhere (Select count(e) from d.employees e)>1
 
 
 
•       命名查询:是指将SQL查询语句编写在映射文件里,在程序中通过Session的getNameQuery()方法来获取该查询语句。
 
<queryname="findDeptsByCondition">
 
     <![CDATA [from Dept d where d.name like:likeName ]]>
 
</query>
 
session.getNamedQuery("findDeptsByCondition")
 
     .setString("likeName","%a%")
 
     .list();
 
 
补充:软件开发 , Java ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,