hibernate查询

概述:数据查询与检索是Hibernate中的一个亮点。相对其他ORM实现而言,Hibernate提供了灵活多样的查询机制。
HQL ——(Hibernate Query Language):Hibernate语言查询它是完全面向对象的查询语句,查询功能非常强大,具备继承、多态和关联等特性 。Hibernate官方推荐使用HQL进行查询。
QBC——(Query By Criteria):标准化对象查询,以对象的方式进行查询,将查询语句封装为对象操作。优点:可读性好,符合Java 程序员的编码习惯。
Native SQL Queries:原生SQL查询,直接使用数据库提供的SQL方言进行查询。

HQL概述

Hibernate查询语言(HQL)是面向对象的查询语言,其结构与SQL查询相似,不同的是,HQL查询的主体是持久化类而不是数据表。
HQL提供了一种应用和数据库之间的抽象,提高了可移植性。
HQL子句本身大小写无关,但是其中出现的类名和属性名必须注意大小写

HQL基本查询

(1)使用HQL查询最简单的例子,就是查询指定类对应表格的所有记录

//1.基本的HQL查询,查询所有属性public void testQueryUser() {Configuration cfg = null;SessionFactory sf = null;Session session = null;Transaction ts = null;try {          sf = HibernateUtil.getSessionFactory();//使用单例模式创建Configuration对象和Session工厂     session = sf.getCurrentSession();//保证每个读写线程有唯一的session实例           ts = session.beginTransaction();//创建事务Query query=session.createQuery("from User");List<User> users=query.list();//查询方法一
//          for(int i=0;i<users.size();i++)
//          {//              User u =users.get(i);
//              System.out.println(u.toString());
//          }//查询方法二
//          for(User u: users)
//          {//              System.out.println(u.toString());
//          }//查询方法三Iterator iterator = users.iterator();while(iterator.hasNext()) {User u=(User)iterator.next();System.out.println(u.toString());}ts.commit();//提交事务} catch (Exception e) {e.printStackTrace();if(ts != null) {ts.rollback();}}finally {}   }


在查询类对应的表格时,需注意到继承的问题,Hibernate会自动判定继承关系,如果查询的类是某类的父类,则会返回与父类、子类对应的所有表格记录。
例如如果查询java.lang.Object,由于Object在Java中是所有类的父类别,所以下面这个查询会返回数据库中所有表格的记录:
Query query = session.createQuery(“from java.lang.Object”);
(2)针对某个属性作查询

//2.基本的HQL查询,查询类的一个属性public void testQueryUserOneAttribute() {Configuration cfg = null;SessionFactory sf = null;Session session = null;Transaction ts = null;try {            sf = HibernateUtil.getSessionFactory();//使用单例模式创建Configuration对象和Session工厂     session = sf.getCurrentSession();//保证每个读写线程有唯一的session实例           ts = session.beginTransaction();//创建事务Query query=session.createQuery("select u.name from User u");//属性List names=query.list();for(int i=0;i<names.size();i++){String name=(String)names.get(i);System.out.println(name);}ts.commit();//提交事务} catch (Exception e) {e.printStackTrace();if(ts != null) {ts.rollback();}}finally {}  }


(3)查询两个以上的属性,查询的结果会以数组的方式返回

//3、基本的HQL查询,查询类的几个属性public void testQueryUserSeveralAttributes(){Configuration cfg =null;SessionFactory sf=null;Session session=null;Transaction ts=null;try {sf=HibernateUtil.getSessionFactory();//SessionFactory单态模式session=sf.getCurrentSession();//保证每个读写线程有唯一的session实例ts=session.beginTransaction();Query query=session.createQuery("select u.name,u.age from User u");List<Object[]> attributes=query.list();       for(int i=0;i<attributes.size();i++){Object obj[] =attributes.get(i);System.out.println(obj[0]+"的年龄"+obj[1]);}ts.commit();} catch (HibernateException e) {// TODO Auto-generated catch blocke.printStackTrace();if(ts !=null) {ts.rollback();}}finally {}}


(4)使用distinct去除资料重复的记录

//4、基本的HQL查询,distinct去除重复public void testQueryUserOneAttributeByDistinct() {Configuration cfg = null;SessionFactory sf = null;Session session = null;Transaction ts = null;try {          sf = HibernateUtil.getSessionFactory();//使用单例模式创建Configuration对象和Session工厂     session = sf.getCurrentSession();//保证每个读写线程有唯一的session实例           ts = session.beginTransaction();//创建事务Query query=session.createQuery("select distinct u.name from User u");//属性List names=query.list();for(int i=0;i<names.size();i++){String name=(String)names.get(i);System.out.println(name);}ts.commit();//提交事务} catch (Exception e) {e.printStackTrace();if(ts != null) {ts.rollback();}}finally {} }


(5)HQL实例化查询
如果User类提供有适当的构建方法,则可以在使用HQL时直接指定新建一个对象传回

//5、基本的HQL查询,实例化查询public void testQueryUserByExample() {Configuration cfg = null;SessionFactory sf = null;Session session = null;Transaction ts = null;try {          sf = HibernateUtil.getSessionFactory();//使用单例模式创建Configuration对象和Session工厂     session = sf.getCurrentSession();//保证每个读写线程有唯一的session实例           ts = session.beginTransaction();//创建事务Query query=session.createQuery("select new User(u.name,u.age) from User u");//属性List<User> users=query.list();for(int i=0;i<users.size();i++){User u=(User)users.get(i);System.out.println(u.getName()+"的年龄"+u.getAge());if(u.getAge()==11) {session.saveOrUpdate(u);//此时u是瞬时对象}}ts.commit();//提交事务} catch (Exception e) {e.printStackTrace();if(ts != null) {ts.rollback();}}finally {}    }

构造方法:

public User(String name,int age) {this.name = name;this.age=age;}


注意,这个返回的User实例并未与数据库有任何关联,可以试着取得id属性,可以发现它的值是0,如果试图使用Session的saveOrupdate()方法,则会新增一条记录而不是更新原有的记录。

HQL统计函数查询

可以在HQL中使用函数,经常使用的函数有如下几个:
count():统计记录条数。
min():求最小值。
max():求最大值。
sum():求和。
avg():求平均值。
1.例如取得记录集的大小:
例子:
Query query = session.createQuery(“select count(*) from User”);
Object count = (Object)query.uniqueResult();//如果查询返回的集合中只有一个对象时,就可以使用uniqueResult()方法
System.out.println(“共有”+count+“条记录”);
2.使用avg()取得属性的平均值:
例子
Query query = session.createQuery(“select avg(u.age) from User u”);
//Object average =(Object)query.uniqueResult();
Number average =(Number)query.uniqueResult();
System.out.println(“平均年龄为:”+average);

HQL条件查询——where子句

1.可以使用where子句来限定查询的条件,除了 = 运算之外,还有 >、>=、<、<=、!= 或 <>等比较运算
例如:
SQuery query = session.createQuery(“from User u where u.username=‘小明’”);
List users = query.list();
for(int i=0;i<users.size();i++)
{
User user =(User)users.get(i);
System.out.println(user.getUsername()+“的密码为:”+user.getPassword());
}
2.在where子句上进行表达式
例如:Query query = session.createQuery(“from User user where (user.age / 10 = 3)”);
在where子句上使用and、or
例如:Query query = session.createQuery(“from User user where (user.age > 20) and (user.name = ‘小明’)");
is not nullL与is null则可以测试字段值是否为空值
例如: Query query = session.createQuery(“from User user where user.name is not null”);
3.between可以测试字段值是否在指定的范围之内
例如: Query query = session.createQuery(“from User user where user.age between 20 and 30”);

//8.基本的HQL查询,条件查询2,查询年龄在2~30岁之间的Userpublic void testQueryUserByWhere2() {Configuration cfg = null;SessionFactory sf = null;Session session = null;Transaction ts = null;try {          sf = HibernateUtil.getSessionFactory();//使用单例模式创建Configuration对象和Session工厂     session = sf.getCurrentSession();//保证每个读写线程有唯一的session实例           ts = session.beginTransaction();//创建事务//Query query=session.createQuery("from User u where u.age between 20 and 30");Query query=session.createQuery("from User u where u.age >= 20 and u.age <= 30");List<User> users=query.list();Iterator iterator = users.iterator();while(iterator.hasNext()) {User u=(User)iterator.next();System.out.println(u.toString());}ts.commit();//提交事务} catch (Exception e) {e.printStackTrace();if(ts != null) {ts.rollback();}}finally {} }


使用in或not in来测试字段值是否在您指定的集合中
例如: Query query = session.createQuery("from User u where u.username in(‘小明’,‘李小白’) “);
like或not like可以让您进行模糊条件搜寻
例如想搜寻名称中含有’大’开头的资料:Query query = session.createQuery(“from User user where user.name like ‘大%’”);

//9.基本的HQL查询,条件查询之模糊查询,查询名字中含有“王”的User
Query query=session.createQuery("from User u where u.name like '%王%' and u.age > 30");

子查询

一个子查询只可以在where子句中出现,并且必须以一对圆括号所包括。

//10.基本的HQL查询,条件查询之嵌套子查询,查询查询年龄大于平均年龄的所有的用户
Query query=session.createQuery("from User u where u.age > (select avg(age) from User u)");

order by子句

对查询结果使用order by进行排序
例子:Query query = session.createQuery(“from User user order by user.age”);
可使用desc反排序
例子:Query query = session.createQuery(“from User user order by user.age desc”);
同时指定两个以上的排序方式
例如先按照"age"反序排列,如果"age"相同,则按照“username"顺序排列:Query query = session.createQuery(“from User user order by user.age desc, user.username”);

//11.基本的HQL查询,条件查询之OrderBy,按照年龄降序,年龄相同,按照名字升序
Query query=session.createQuery("from User u order by u.age desc, u.name");

group by子句

(1)使用GROUP BY子句,自动将指定的字段依相同的内容群组
例如依字段“password"分组并作平均:Query query = session.createQuery(“select avg(user.age) from User user group by user.password”);

//12.基本的HQL查询,条件查询之分组查询,统计男生女生各有多少public void testQueryByGroup() {Configuration cfg = null;SessionFactory sf = null;Session session = null;Transaction ts = null;try {            sf = HibernateUtil.getSessionFactory();//使用单例模式创建Configuration对象和Session工厂     session = sf.getCurrentSession();//保证每个读写线程有唯一的session实例           ts = session.beginTransaction();//创建事务//此时avg统计查询是对分组之后的每一组进行的Query query=session.createQuery("select u.gender,avg(u.age) from User u group by u.gender");List<Object[]> list=query.list();for(int i=0;i<list.size();i++) {Object[] objs=(Object[])list.get(i);System.out.println(objs[0]+"的平均年龄为:"+objs[1]);}ts.commit();//提交事务} catch (Exception e) {e.printStackTrace();if(ts != null) {ts.rollback();}}finally {} }


(2)结合having子句,对查询出来的组进行限制
例如只将平均年龄大于20的记录分组显示出来:Query query = session.createQuery(“select user.password, avg(user.age) from User user group by user.password having avg(user.age) > 20");

//13.基本的HQL查询,条件查询之分组查询,having可以对每组进行限制//此时avg统计查询是对分组之后的每一组进行的Query query=session.createQuery("select u.gender,avg(u.age) from User u group by u.gender having avg(u.age) > 20");

参数绑定查询

(1)在HQL语句中使用“?”占位符,使用query的setXXX方法给“?”绑定参数
例如
Query query = session.createQuery(“from User u where u.username=?”);
query.setString(0,“李小白”);
List users = query.list();

//Query query=session.createQuery("from User u where u.name = ?");
//query.setString(0, "李四");
query.setParameter(0, "李四");


(2)“?”参数以外,还可以使用命名参数来表示参数。同一个命名参数可以在一个查询中出现多次。
例如:
Query query = session.createQuery(“from User u where u.username=:name");
query.setString(“name”,“李小白”);
List users = query.list();
(3)分页查询
控制分页Query有两个方法
一是:setFirstResult(int firstResult):设定从那个对象开始检索。
二是:setMaxResults(int maxResult):设置一次最多能检索出对象的数目。
例如:
//从第一行开始,提取前5个对象(记录)
Query query=session.createQuery(“from User”);
query.setFirstResult(0);
query.setMaxResults(5);
List result=query.list();

//16.分页查询public void testQueryByPage1() {QueryByPage(3);}public void QueryByPage(int pageSize) {Configuration cfg = null;SessionFactory sf = null;Session session = null;Transaction ts = null;try {         sf = HibernateUtil.getSessionFactory();//使用单例模式创建Configuration对象和Session工厂     session = sf.getCurrentSession();//保证每个读写线程有唯一的session实例           ts = session.beginTransaction();//创建事务Query query=session.createQuery("select count(*) from User u");Number cnts = (Number)query.uniqueResult();           int userCount = cnts.intValue();int pageCount = 0;pageCount = userCount / pageSize;if(userCount % pageSize != 0) {pageCount++;}Query query1=session.createQuery("from User u");for(int i=0;i<pageCount;i++) {System.out.println("第"+i+"页:");System.out.println("-----------------------------");query1.setFirstResult(i*pageSize);query1.setMaxResults(pageSize);List<User> us=query1.list();for(User u : us) {System.out.println(u.toString());}}ts.commit();//提交事务} catch (Exception e) {e.printStackTrace();if(ts != null) {ts.rollback();}}finally {} }

在映射文件中定义命名查询语句(HQL)

映射文件中的配置
<hibernate-mapping package=“my.hibernate.domainEntity”>
<class name=“User”table=“t_user”>
……

<![CDATA[ from User u where u.username=:name ]]>

</hibernate-mapping>
  在程序中使用
Query query=session.getNamedQuery(“findUserByName”);
query.setString(“name”, “Tom”);
List list=query.list();

//17.基本的HQL查询,在User.hbm.xml定义命名查询标签public void testQueryUserByQueryTag() {Configuration cfg = null;SessionFactory sf = null;Session session = null;Transaction ts = null;try {            sf = HibernateUtil.getSessionFactory();//使用单例模式创建Configuration对象和Session工厂     session = sf.getCurrentSession();//保证每个读写线程有唯一的session实例           ts = session.beginTransaction();//创建事务Query query=session.getNamedQuery("findUserByName");query.setParameter("username", "李四");List<User> users=query.list();Iterator iterator = users.iterator();while(iterator.hasNext()) {User u=(User)iterator.next();System.out.println(u.toString());}ts.commit();//提交事务} catch (Exception e) {e.printStackTrace();if(ts != null) {ts.rollback();}}finally {}   }
<query name="findUserByName"><![CDATA[from User u where u.name=:username]]>
</query>

使用HQL更新和删除记录

在Hibernate 3中,HQL新增了update与delete语句,可以直接使用HQL指定更新或删除
例如使用update子句进行更新:
ts = session.beginTransaction();
Query query = session.createQuery(“update User set username=‘小糊涂’ where username=‘小明白’”);
query.executeUpdate();
ts.commit();
注意:把操作放在事务中,并做提交,因为要更新数据库。

//18.基本的HQL查询,把王19更新成小明白public void testUpdate() {Configuration cfg = null;SessionFactory sf = null;Session session = null;Transaction ts = null;try {            sf = HibernateUtil.getSessionFactory();//使用单例模式创建Configuration对象和Session工厂     session = sf.getCurrentSession();//保证每个读写线程有唯一的session实例           ts = session.beginTransaction();//创建事务Query query = session.createQuery("update User u set u.name='小明白' where u.name='王19' ");query.executeUpdate();ts.commit();//提交事务} catch (Exception e) {e.printStackTrace();if(ts != null) {ts.rollback();}}finally {}  }

使用HQL更新和删除记录

使用delete子句进行资料删除
例子:
ts = session.beginTransaction();
Query query = session.createQuery(“delete User u where u.username=‘赵二’”);
query.executeUpdate();
ts.commit();

//18.基本的HQL删除,把王18删除public void testDelete() {Configuration cfg = null;SessionFactory sf = null;Session session = null;Transaction ts = null;try {            sf = HibernateUtil.getSessionFactory();//使用单例模式创建Configuration对象和Session工厂     session = sf.getCurrentSession();//保证每个读写线程有唯一的session实例           ts = session.beginTransaction();//创建事务Query query = session.createQuery("delete User u where u.name='王18' ");query.executeUpdate();ts.commit();//提交事务} catch (Exception e) {e.printStackTrace();if(ts != null) {ts.rollback();}}finally {}  }

Hibernate查询——HQL,包括分页查询相关推荐

  1. mybatis 分页查询_MyBatis之分页查询:MyBatis PageHelper

    MyBatis,作为目前流行的ORM框架,大大方便了日常开发.而对于分页查询,虽然可以通过SQL的limit语句实现,但是比较繁琐.而MyBatis PageHelper的出现,则解决了这一痛点.这里 ...

  2. Hibernate中hql的基本查询、条件查询、排序插叙、分页查询、投影查询

    hql语句和sql语句不同,当我们使用hql语句查询时,要把SQL语句的表写成 实体类的类名,字段写成实体类的属性 基本查询:查出数据库中所有的数据 代码如下: //基本查询,查询所有的实体@Test ...

  3. HQL查询包括分页查询

    hibernate查询 概述:数据查询与检索是Hibernate中的一个亮点.相对其他ORM实现而言,Hibernate提供了灵活多样的查询机制. HQL --(Hibernate Query Lan ...

  4. Hibernate之HQL多表查询

    多表的查询进行使用HQL语句进行查询,HQL语句和SQL语句的查询语法比较类似 内连接查询 显示内连接 select * from customer c inner join orders o on ...

  5. JPA分页查询与条件分页查询

    情有独钟的JPA 平时在写一些小项目时,比较喜欢引用 Spring Data Jpa,其实还是图他写代码快~ 在日常的开发工作中,分页列表查询基本是随处可见,下面一起看一下如何使用 jpa 进行多条件 ...

  6. java oracle数据库高效分页查询_oracle高效分页查询总结

    探索查询语句: --分页参数:size = 20 page = 2 --没有order by的查询 -- 嵌套子查询,两次筛选(推荐使用) --SELECT * -- FROM (SELECT ROW ...

  7. java通用分页条件查询_通用分页查询

    packagecom.dao;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.util.ArrayList;import ...

  8. java oracle分页查询语句_oracle分页查询语句,java得到分页查询语句的方法

    oracle分页查询语句 select * from ( select a.*, rownum rn from (select * from table_name) a where rownum &l ...

  9. java mybatis分页查询语句_mybatis分页查询的实现(一)

    一.总结了mybatis中五种不同实现分页查询的方法 UserMapper.java接口文件 public interface UserMapper { //分页查询 public List sele ...

最新文章

  1. android:themes.xml
  2. CloudStack管理员文档 - 服务方案
  3. Struts2 (三)OGLN
  4. java ssm使用存储过程_java调用oracle存储过程(ssm)
  5. 数学--数论--欧拉降幂和广义欧拉降幂(实用好理解)
  6. html5 txt文件上传,JavaScript html5利用FileReader实现上传功能
  7. WiFi的基本调制过程
  8. java 异常捕获抛出_JAVA异常处理捕获与抛出原理解析
  9. ajax child,如何在ajax上使用this.children
  10. SpringBoot集成MyBatis-Plus框架详细方法
  11. hdu3535 (分组背包,最少选一 + 最多选一 + 随意)
  12. POSIX线程专有数据的空间释放问题,pthread_key_create
  13. Leetcode - 143. Reorder List
  14. base64与图片互换
  15. 光域网(IES)在Unity3d中的应用【2020】
  16. 平板做笔记本电脑的副屏教程
  17. HBase的java代码开发(完整源码)
  18. One-Error多标签分类_多分类及多标签分类算法
  19. 利用微信开发者工具获取小程序指定页面路径!
  20. 删除桌面“恶意”图标

热门文章

  1. 线性回归 假设_线性回归的假设
  2. Android添加圆角渐变色按钮
  3. Oracle Advanced Queue (DBMS_AQ/DMBS_AQADM)
  4. 白鹭[egret]运行项目
  5. ROS工作空间编译的时候出现类似于Could_not_find_a_package_configuration_file _provided _by该如何解决
  6. 数据挖掘和互联网广告-如何应对网盟广告作弊
  7. 芯准TTE宏时隙调度机制 —— 宏时隙的硬件实现
  8. 仅仅9行代码 爬取教务处成绩 仅用2个模块 正方教务系统
  9. ATU中GSM Layer3
  10. C语言程序设计(谭浩强)