Hibernate的检索方式
Hibernate的检索方式
检索方式(查询的方式)
导航对象图检索方式: 根据已经加载的对象导航到其他对象
Customer customer = (Customer)session.get(Customer.class,1);
customer.getOrders();// 获得到客户的订单
OID 检索方式: 按照对象的 OID 来检索对象
get()/load();方法进行检索.
HQL 检索方式: 使用面向对象的 HQL 查询语言
Query query = session.createQuery(“HQL”);
QBC 检索方式: 使用 QBC(Query By Criteria) API 来检索对象. 这种 API 封装了基于字符串形式的查询语句, 提供了更加面向对象的查询接口.
Criteria criteria = session.createCriteria(Customer.class);
本地 SQL 检索方式: 使用本地数据库的 SQL 查询语句
SQLQuery query = session.createSQLQuery(“SQL”);
HQL
HQL:Hibernate Query Language
特点:面向对象的查询,支持方法链编程
1.查询所有记录
- List<Customer> list = session.createQuery("from Customer").list();
- for (Customer customer : list) {
- System.out.println(customer);
- }
2.查询使用别名
- // 使用别名,别名as可以省略
- List<Customer> list =session.createQuery("from Customer c").list();
- System.out.println(list);
- // 使用别名:带参数
- List<Customer> list = session.createQuery("from Customer as c where c.cname = ?").setString(0, "小沈").list();
- System.out.println(list);
- // 不支持 select * from Customer写法.可以写成 select 别名 from Customer as 别名;
- List<Customer> list = session.createQuery("select c from Customer c").list();
- System.out.println(list);
3.排序
- List<Customer> list = session.createQuery("from Customer c order by c.id desc").list();
- for (Customer customer : list) {
- System.out.println(customer);
- }
4.分页查询
- Query query = session.createQuery("from Order");
- query.setFirstResult(20);
- query.setMaxResults(10);
- List<Order> list = query.list();
- for (Order order : list) {
- System.out.println(order);
- }
5.单个对象查询
- Customer customer = (Customer) session.createQuery("from Customer where cname = ?").setString(0, "小明").uniqueResult();
- System.out.println(customer);
6.参数绑定
- // 1.使用?号方式绑定
- Query query = session.createQuery("from Customer where cname = ?");
- query.setString(0, "小沈");
- List<Customer> list = query.list();
- System.out.println(list);
- Query query = session.createQuery("from Customer where cname = ? and cid =?");
- query.setString(0, "小沈");
- query.setInteger(1,3);
- List<Customer> list = query.list();
- System.out.println(list);
- // 2.使用名称的方式绑定
- Query query = session.createQuery("from Customer where cname=:name and cid=:id");
- query.setString("name", "小沈");
- query.setInteger("id", 3);
- List<Customer> list = query.list();
- System.out.println(list);
- // 3.绑定实体
- List<Order> list = session.createQuery("from Order o where o.customer = ?").setEntity(0, customer).list();
- for (Order order : list) {
- System.out.println(order);
- }
7.投影操作
- // 查询客户的名称
- List<Object> list = session.createQuery("select c.cname from Customer c").list();
- System.out.println(list);
- //查两个属性
- List<Object[]> list = session.createQuery("select c.cid,c.cname from Customer c").list();
- for (Object[] objects: list) {
- System.out.println(Arrays.toString(objects));
- }
- //需要提供适当的构造方法
- List<Customer> list = session.createQuery("select new Customer(cname) from Customer").list();
- System.out.println(list);
8.模糊查询
- Query query = session.createQuery("from Customer where cname like ?");
- query.setParameter(0, "小%");
- List<Customer> list = query.list();
- System.out.println(list);
9.聚集函数
- Long count = (Long) session.createQuery("select count(*) from Order").uniqueResult();
- System.out.println(count);
10.命名查询(在配置文件中配置查询语句)
- List<Customer> list = session.getNamedQuery("findAll").list();
- System.out.println(list);
SQL多表查询(连接)
交叉连接(用得少):select * from A,B
内连接(自然连接):select * from A inner join B on A.字段 = B.字段;
隐式内连接:select * from A,B where A.字段 = B.字段;
外连接
左外连接:select * from A left outer join B on A.字段 = B.字段;
右外连接:select * from A right outer join B on A.字段 = B.字段;
HQL多表的查询
交叉连接,内连接,隐式内连接,迫切内连接,左外连接,迫切左外连接,右外连接
隐式内连接(了解)
createQuery("from Order o where o.customer.name like 'T%'");
等价于:from Order o join o.customer c where c.name like 'T%'
HQL的内连接和迫切内连接区别(其他类似):
内连接查询 :将数据封装一个List<Object[]>中.
迫切内连接 :将数据封装一个List<Customer>中.但是迫切内连接,得到会有重复记录 ,需要使用distinct排重.
- // 内连接查询:
- Query query = session.createQuery("from Customer c inner join c.orders");
- List<Object[]> list = query.list();
- for (Object[] objects : list) {
- Customer c = (Customer)objects[0];
- Order o = (Order)objects[1];
- System.out.println(c.getCid()+" "+c.getCname()+" "+c.getAge());
- System.out.println(o.getOid()+" "+o.getAddr());
- }
- // 迫切内连接:使用一个关键字 fetch(HQL)
- Query query = session.createQuery("select distinct c from Customer c inner join fetch c.orders");
- List<Customer> list = query.list();
- for (Customer customer : list) {
- System.out.println(customer);
- }
QBC
1.查询所有记录
- List<Customer> list = session.createCriteria(Customer.class).list();
- for (Customer customer : list) {
- System.out.println(customer);
- }
2.排序
- List<Customer> list = session.createCriteria(Customer.class).addOrder(org.hibernate.criterion.Order.desc("id")).list();
- for (Customer customer : list) {
- System.out.println(customer);
- }
3.分页
- Criteria criteria = session.createCriteria(Order.class);
- criteria.setFirstResult(10);
- criteria.setMaxResults(10);
- List<Order> list = criteria.list();
- for (Order order : list) {
- System.out.println(order);
- }
4.获取单个对象
- Customer customer = (Customer) session.createCriteria(Customer.class).add(Restrictions.eq("cname", "小明")).uniqueResult();
- System.out.println(customer);
5.带参数的查询
- List<Customer> list = session.createCriteria(Customer.class).add(Restrictions.eq("cname", "小明")).list();
- System.out.println(list);
- List<Customer> list = session.createCriteria(Customer.class).add(Restrictions.eq("cname", "小明")).add(Restrictions.eq("cid", 2)).list();
- System.out.println(list);
6.模糊查询
- Criteria criteria = session.createCriteria(Customer.class);
- criteria.add(Restrictions.like("cname", "大%"));
- List<Customer> list = criteria.list();
- System.out.println(list);
SQL
- List<Object[]> list = session.createSQLQuery("select * from customer").list();
- for (Object[] objects : list) {
- System.out.println(Arrays.toString(objects));
- }
- List<Customer> list = session.createSQLQuery("select * from customer").addEntity(Customer.class).list();
- for (Customer customer : list) {
- System.out.println(customer);
- }
离线查询
- @Test
- /*
- * 离线条件查询
- */
- public void demo(){
- // web层的封装
- DetachedCriteria criteria = DetachedCriteria.forClass(Customer.class);
- criteria.add(Restrictions.eq("cname", "小明"));
- criteria.add(Restrictions.eq("cid", 2));
- // 传递到DAO层
- Session session = HibernateUtils.openSession();
- Transaction tx = session.beginTransaction();
- Criteria c1 = criteria.getExecutableCriteria(session);
- List<Customer> list = c1.list();
- System.out.println(list);
- tx.commit();
- session.close();
- }
Hibernate的检索方式的更多相关文章
- 攻城狮在路上(壹) Hibernate(十四)--- Hibernate的检索方式(下)
本节介绍HQL和QBC的高级用法:各种连接查询.投影查询.报表查询.动态查询.集合过滤和子查询等.另外将归纳优化查询程序代码,从而提高查询性能的各种技巧.一.连接查询: HQL与QBC支持的各种连接类 ...
- 攻城狮在路上(壹) Hibernate(十三)--- Hibernate的检索方式(上)
Hibernate提供了以下几种检索对象的方式: A.导航对象图检索方式. B.OID检索方式.Session.get() load(); C.HQL检索方式.Query. D.QBC检索方式.Que ...
- Hibernate的检索方式--查询数据的方式
Hibernate 提供了以下几种检索对象的方式1导航对象图检索方式: 根据已经加载的对象导航到其他对象(根据已经加载的对象,导航到其他对象-例如一对多的查询)2OID 检索方式: 按照对象的 OID ...
- 【Hibernate】检索方式
一.概述 二.HQL 2.1 简介 2.2 查询所有记录 2.3 查询使用别名 2.4 排序 2.5 分页查询 2.6 单个对象查询 2.7 参数绑定 2.8 投影操作 2.9 模糊查询 2.10 S ...
- Hibernate之检索方式
时间:2017-1-22 16:09 --检索方式Hibernate中提供了以下几种检索对象的方式: * 导航对象图检索方式 根据已经加载额对象导航到其他对象. ...
- Hibernate入门6.Hibernate检索方式
Hibernate入门6.Hibernate检索方式 20131128 代码下载 链接: http://pan.baidu.com/s/1Ccuup 密码: vqlv Hibernate的整体框架已经 ...
- [原创]java WEB学习笔记89:Hibernate学习之路-- -Hibernate检索方式(5种),HQL介绍,实现功能,实现步骤,
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Hibernate检索方式 分类: SSH框架 2015-07-10 22:10 4人阅读 评论(0) 收藏
我们在项目应用中对数据进行最多的操作就是查询,数据的查询在所有ORM框架中也占有极其重要的地位.那么,如何利用Hibernate查询数据呢?Hibernate为我们提供了多种数据查询的方式,又称为Hi ...
- Hibernate检索方式(转载)
我们在项目应用中对数据进行最多的操作就是查询,数据的查询在所有ORM框架中也占有极其重要的地位. 那么,如何利用Hibernate查询数据呢?Hibernate为我们提供了多种数据查询的方式,又称为H ...
随机推荐
- MapReduce实现手机上网日志分析(分区)
一.问题背景 实际业务的需要,比如以移动为例,河南的用户去了北京上网,那么他的上网信息默认保存在了北京的基站,那么我们想要查询北京地区的上网日志信息默认也包含了其他地区用户的在本区的上网信息,否则只能 ...
- vs创建项目模板和项模板
原文地址:https://msdn.microsoft.com/zhcn/library/xkh1wxd8(v=vs.140).aspx 如何:创建项目模板 Visual Studio 2015 ...
- MySQL 5.6 新参数对binlog日志量的优化
数据库版本:5.6.* 1.row日志image类型 参数binlog_row_image 控制着这种image类型,默认为FULL(log all columns),即记录before&af ...
- php多进程总结
本文部分来自网络参考,部分自己总结,由于一直保存在笔记中,并没有记录参考文章地址,如有侵权请通知删除.最近快被业务整疯了,这个等抽时间还需要好好的整理一番. 多进程--fork 场景:日常任务中, ...
- fatal: could not read Username for 'https://github.com': No such file or directo
Git push origin master报错 fatal: could not read Username for 'https://github.com': No such file or di ...
- NPM
参考资料: 淘宝NPM
- (转载)JavaWeb学习总结(五十一)——邮件的发送与接收原理
博客源地址:http://www.cnblogs.com/xdp-gacl/p/4209586.html 一. 邮件开发涉及到的一些基本概念 1.1.邮件服务器和电子邮箱 要在Internet上提供电 ...
- [Java] Java反射
首先推荐三个十分有趣的网站: http://www.programcreek.com/simple-java/ http://tutorials.jenkov.com/ http://www.meet ...
- Linux启动新进程的几种方法汇总
有时候,我们需要在自己的程序(进程)中启动另一个程序(进程)来帮助我们完成一些工作,那么我们需要怎么才能在自己的进程中启动其他的进程呢?在Linux中提供了不少的方法来实现这一点,下面就来介绍一个这些 ...
- ReactiveCocoa源码拆分解析(二)
(整个关于ReactiveCocoa的代码工程可以在https://github.com/qianhongqiang/QHQReactive下载) 上面抽丝剥茧的把最主要的信号机制给分离开了.但在RA ...