Hibernate的几种查询方式-HQL,QBC,QBE,离线查询,复合查询,分页查询
HQL查询方式
这一种我最常用,也是最喜欢用的,因为它写起来灵活直观,而且与所熟悉的SQL的语法差不太多。条件查询、分页查询、连接查询、嵌套查询,写起来与SQL语法基本一致,唯一不同的就是把表名换成了类或者对象。其它的,包括一些查询函数(count(),sum()等)、查询条件的设定等,全都跟SQL语法一样。
示例:
Session session = SessionFactory.getCurrentSession();
User user = null;
Transaction ts = session.beginTransaction();
try {
Query query = session.createQuery("from User as u where name='ijse'");
user= (User) query.list().get(0);
session.commit();
} catch (HibernateException ex) {
ts.rollBack();
ex.printStackTrace();
}
System.out.println(user.getName());
QBC(Query By Criteria) 查询方式
这种方式比较面向对象方式,重点是有三个描述条件的对象:Restrictions,Order,Projections。使用QBC查询,一般需要以下三个步骤:
- 使用Session实例 的createCriteria()方法创建Criteria对象
- 使用工具类Restrictions的方法为Criteria对象设置查询条件,Order工具类的方法设置排序方式,Projections工具类的方法进行统计和分组。
- 使用Criteria对象的list()方法进行查询并返回结果
Restrictions类的常用方法:
方法名称 |
描述 |
| Restrictions.eq | 等于 |
| Restrictions.allEq | 使用Map,Key/Valu进行多个等于的比对 |
| Restrictions.gt | 大于 |
| Restrictions.ge | 大于等于 |
| Restrictions.lt | 小于 |
| Restrictions.le | 小于等于 |
| Restrictions.between | 对应SQL的between |
| Restrictions.like | 对应SQL的like |
| Restrictions.in | 对应SQL的in |
| Restrictions.and | and关系 |
| Restrictions.or | or关系 |
| Restrictions.sqlRestriction | SQL限定查询 |
Order类的常用方法:
方法名称 |
描述 |
| Order.asc | 升序 |
| Order.desc | 降序 |
Projections类的常用方法
方法名称 |
描述 |
| Projections.avg | 求平均值 |
| Projections.count | 统计某属性的数量 |
| Projections.countDistinct | 统计某属性不同值的数量 |
| Projections.groupProperty | 指定某个属性为分组属性 |
| Projections.max | 求最大值 |
| Projections.min | 求最小值 |
| Projections.projectionList | 创建一个ProjectionList对象 |
| Projections.rowCount | 查询结果集中的记录条数 |
| Projections.sum | 求某属性的合计 |
示例:
Session session = SessionFactory.getCurrentSession();
User user = null;
Transaction ts = session.beginTransaction();
try {
Criteria criteria = session.createCriteria(User.class);
criteria.add(Restrictions.eq("name","ijse"));
user= (User) criteria.list().get(0);
session.commit();
} catch (HibernateException ex) {
ts.rollBack();
ex.printStackTrace();
}
System.out.println(user.getName());
QBE(Query By Example)查询方式
将一个对象的非空属性作为查询条件进行查询。
示例:
Session session = SessionFactory.getCurrentSession();
User user = new User();
user.setName("ijse");
Transaction ts = session.beginTransaction();
try {
Criteria criteria = session.createCriteria(User.class);
criteria.add(Example.create(user));
user= (User) criteria.list().get(0);
session.commit();
} catch (HibernateException ex) {
ts.rollBack();
ex.printStackTrace();
}
System.out.println(user.getName());
离线查询
离线查询就是建立一个DetachedCriteria对象,将查询的条件等指定好,然后在session.beginTransaction()后将这个对象传入。通常这个对象可以在表示层建立,然后传入业务层进行查询。
示例:
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(User.class);
detachedCriteria.add(Restrictions.eq("name","ijse"); Session session = SessionFactory.getCurrentSession();
User user = new User();
Transaction ts = session.beginTransaction();
try {
Criteria criteria = detachedCriteria.getExecutableCriteria(session);
user= (User) criteria.list().get(0);
session.commit();
} catch (HibernateException ex) {
ts.rollBack();
ex.printStackTrace();
}
System.out.println(user.getName());
复合查询
复合查询就是在原有查询的基础上再进行查询,可以调用Criteria对象的createCriteria()方法在这个Criteria对象的基础上再进行查询。
示例:
Session session = SessionFactory.getCurrentSession();
User user = new
User();
Transaction ts = session.beginTransaction();
try
{
Criteria criteria1 =
session.createCriteria(Room.class);
Criteria
criteria2 =criterial1.createCriteria("User");
criteria2.add(Restrictions.eq("name",new String("ijse"));
user= (User) criteria.list().get(0);
session.commit();
} catch (HibernateException ex) {
ts.rollBack();
ex.printStackTrace();
}
System.out.println(user.getName());
分页查询
分页查询主要是要指定两个参数:从第几条数据开始,取多少条数据。可以通过调用Query或者Criteria对象的setFirstResult()和setMaxResults()方法分别进行设定。
示例:
Session session = SessionFactory.getCurrentSession();
List userList = null;
Transaction ts = session.beginTransaction();
try {
Criteria criteria = session.createCriteria(User.class);
criteria.setFirstResult(0);//从第一个数据开始
criteria.setMaxResults(10);//取10条记录
userList = (List) criterial.list();
session.commit();
} catch (HibernateException ex) {
ts.rollBack();
ex.printStackTrace();
}
Hibernate的几种查询方式-HQL,QBC,QBE,离线查询,复合查询,分页查询的更多相关文章
- Hibernate 查询方式(HQL/QBC/QBE)汇总
作为老牌的 ORM 框架,Hibernate 在推动数据库持久化层所做出的贡献有目共睹. 它所提供的数据查询方式也越来越丰富,从 SQL 到自创的 HQL,再到面向对象的标准化查询. 虽然查询方式有点 ...
- java框架之Hibernate(4)-几种检索方式
准备 模型及映射文件 package com.zze.bean; import java.util.HashSet; import java.util.Set; public class Class ...
- 分页查询信息(使用jdbc连接mysql数据库实现分页查询任务)
分页查询信息 使用jdbc连接mysql数据库实现分页查询任务 通过mysql数据库提供的分页机制,实现商品信息的分页查询功能,将查询到的信息显示到jsp页面上. 本项目 ...
- 【mybatis】在mybatis分页查询时,主表对关联表 一对多 分页查询怎么实现
现在有这样一个需求: 1.积分商品分页查询 2.一个积分商品会有多张商品图片在商品图片表 1:n的关系 这样在积分商品分页查询的时候,想要顺便把每个积分商品对应的商品图片信息也带出来 实现如下: 1 ...
- sql分页查询(2005以后的数据库)和access分页查询
sql分页查询: select * from ( select ROW_NUMBER() over(order by 排序条件) as rowNumber,* from [表名] where 条件 ) ...
- spring 中 hibernate 的 2种 配置方式(新旧 2种方式)
Spring对hibernate配置文件hibernate.cfg.xml的集成,来取代hibernate.cfg.xml的配置 Spring对hibernate配置文件hibernate.cfg.x ...
- hibernate检索方式(HQL 检索方式,QBC 检索方式,本地 SQL 检索方式)
hibernate有五种检索方式,这儿用 单向的一对多的映射关系 例子,这儿有后三种的方式: 导航对象图检索方式: 根据已经加载的对象导航到其他对象 OID 检索方式: 按照对象的 OID 来检索对象 ...
- (十)Hibernate 查询方式
所有项目导入对应的hibernate的jar包.mysql的jar包和添加每次都需要用到的HibernateUtil.java 第一节:Hibernate 查询方式简介 1,导航对象图查询方式: 2 ...
- hibernate框架学习之数据查询(HQL)
lHibernate共提供5种查询方式 •OID数据查询方式 •HQL数据查询方式 •QBC数据查询方式 •本地SQL查询方式 •OGN数据查询方式 OID数据查询方式 l前提:已经获取到了对象的OI ...
随机推荐
- 11636 - Hello World! (贪心法)
Problem A Hello World! Input: Standard Input Output: Standard Output When you first made the comput ...
- jQuery简介以及jQuery选择器
一 简介 1 定义:jQuery库是JavaScript的封装库 2 优点: 1) : 代码开源 2) : 选择器强大 3) : 完善的Ajax 4) : 浏览器兼容性高 5) : 文档完善(帮助文档 ...
- C# 并行编程 之 并发集合 (.Net Framework 4.0)(转)
转载地址:http://blog.csdn.net/wangzhiyu1980/article/details/45497907 此文为个人学习<C#并行编程高级教程>的笔记,总结并调试了 ...
- Swift - defer关键字(推迟执行)
在一些语言中,有try/finally这样的控制语句,比如Java. 这种语句可以让我们在finally代码块中执行必须要执行的代码,不管之前怎样的兴风作浪. 在Swift 2.0中,Apple提供了 ...
- (原)python使用ctypes调用C/C++接口
转载请注明出处: http://www.cnblogs.com/darkknightzh/p/6135514.html 参考网址: https://docs.python.org/2/library/ ...
- HDU 2063 裸奔的二分图最大匹配
#include <cstdio>#include <cmath>#include <algorithm>#include <iostream>#inc ...
- [Leetcode][048] Rotate Image 略详细 (Java)
题目在这里 https://leetcode.com/problems/rotate-image/ [个人分析] 这个题目,我觉得就是考察基本功.考察细心的,算法方面没有太多东西,但是对于坐标的使用有 ...
- 在git bush中如何退出vim编辑器
写npm的pakege.json文件的files配置时,如果有不想包含的文件,那就要创建.npmignore文件排除,但windows系统又不允许创建以点开头命名的文件,咋办? 这时候就要用到linu ...
- js实现网页收藏功能,动态添加删除网址
<html> <head> <title> 动态添加删除网址 </title> <meta charset="utf-8"&g ...
- python学习第十八天 --错误&异常处理
这一章节主要讲解python的错误和异常处理 什么是错误和异常?及其区别? 错误: 1.语法错误:代码不符合解释器或者编译器语法. 2.逻辑错误:不完整或者不合法输入或者计算出现问题. 异常:执行 ...