图二 离线条件查询

Struts 2是web层的框架。session得在dao层才有。有的时候这些数据是没在你的对象里面的。像是否上传简历。这个字段不在我的数据库里面。例如是否上传简历这个条件不在我们的数据库里面。你只是通过你的数据库里面的某个字段判断它是否为空而已。假设这几个字段都没在你的对象(User)里面,你得在web层把这些数据都通过通拿到。假设我的高级查询里面字段特别多呢,传起来特别麻烦。你传统方式只能这样去调用了。

咱们的Criteria得session的session.createCriteria()才能创建它啊。在web层就可以拿到一个离线的Criteria。我这个dao里面有这个session对象,所以离线的条件查询就是为了做这种的。有些数据是没有办法封装的,你可以直接在web层把这些数据封装到传到dao层调用session的方法去执行。

package cn.itcast.test;

import java.util.Arrays;
import java.util.List; import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Restrictions;
import org.junit.Test; import cn.itcast.utils.HibernateUtils;
import cn.itcast.vo.Customer;
import cn.itcast.vo.Order; /**
* Hibernate的检索方式
* @author zhongzh
*
*/
public class HibernateDemo1 {
@Test
/*
* 离线条件查询
*
*/
public void demo15(){
//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();//不用在DAO层去设置这些条件 直接在这儿就拿到一个对象
System.out.println(list); tx.commit();
session.close();
}
@Test
/*
* 命名查询
*
*/
public void demo14(){
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
List<Customer> list = session.getNamedQuery("findAll").list();//带有名称的query接口
System.out.println(list);
tx.commit();
session.close();
} @Test
/*
* 聚集函数:
*
*/ public void demo13(){
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction(); Long count = (Long) session.createQuery("select count(*) from Order").uniqueResult();
System.out.println(count);
/*Query query = session.createQuery("select count(*) from Order");
List<Integer> list = query.list();
System.out.println(list);
List<Long> list = query.list();
for (Long long1 : list) {
System.out.println(long1);
}*/
tx.commit();
session.close();
}
@Test
/*
*
* 多表查询:
*
*/
public void demo12(){
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
//内连接查询的是两个表的交集部分:
Query query = session.createQuery("from Customer c inner join c.orders");//Query接口
//List list = query.list();
//Query query = session.createQuery("from Customer c inner join c.orders");//Query接口
//Query query = session.createQuery("from Order o inner join o.customer");//Query接口
//Query query = session.createQuery("select distinct c from Customer c inner join c.orders");//Query接口
//Query query = session.createQuery("select distinct o from Order o inner join o.customer");//Query接口
List<Object[]> list = query.list();
for (Object[] objects : list) {
System.out.println(Arrays.toString(objects));
}
// 迫切内连接:使用一个关键字 fetch(HQL)
//Query query = session.createQuery("from Customer c inner join fetch c.orders");//Query接口
//List list = query.list();
//Query query = session.createQuery("from Customer c inner join fetch c.orders");//Query接口
//Query query = session.createQuery("select distinct c from Customer c inner join fetch c.orders");//Query接口
//Query query = session.createQuery("from Order o inner join fetch o.customer");//Query接口
//Query query = session.createQuery("select distinct o from Order o inner join fetch o.customer");//Query接口 /* List<Customer> list = query.list();
for (Customer customer : list) {//关联查询的时候会得到多少条记录?
System.out.println(customer);//两个表的关联查询,内连接查询会得到30条记录
//为什么会有重复的数据?因为这是封装的问题
}*/
/* List<Order> list = query.list();
for (Order order : list) {
System.out.println(order);
}*/ tx.commit();
session.close();
} @Test
/*模糊查询
*
*
*/
public void demo11(){
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction(); //HQL
/* Query query= session.createQuery("from Customer where cname like ?");
query.setParameter(0, "小%");
List<Customer> list = query.list();
System.out.println(list);*/ //QBC:
Criteria criteria = session.createCriteria(Customer.class);
//criteria.add(Restrictions.ilike("cname", "小%"));
criteria.add(Restrictions.ilike("cname", "大%"));
List<Customer> list = criteria.list();
System.out.println(list); tx.commit();
session.close(); } @Test
/*
* in like is null....
* QBC条件查询
*
*/
public void demo10(){
Session session= HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
//类似于这种条件查询用?号进行绑定的你都可以用QBC进行替换
//QBC如何替换?QBC进行条件检索 /*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);//这是绑定多个条件的 tx.commit();
session.close();
} @Test
/*
*
* 投影操作:查询对象的某几个属性
*/
public void demo9(){
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction(); //查询客户的名称:
/* List 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));
}
System.out.println(list);*/ List<Customer> list = session.createQuery("select new Customer(cname) from Customer").list();
//可以用这种类似于我们对象的这种构造的形式来进行查询 类似于对象构造的形式来进行查询
System.out.println(list);
tx.commit();
session.close();
}
@Test
/*
*
* 绑定参数
*/
public void demo8(){
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction(); //HQL的参数绑定
//1.使用?号方式绑定
/* Query query = session.createQuery("from Customer where cname = ?");
query.setString(0, "小沈");
List<Customer> list = query.list();
//query.uniqueResult();
System.out.println(list);*/ /*Query query = session.createQuery("from Customer where cname = ? and cid=?");
query.setString(0, "小沈");//0是第一个?号 第一个?号的值是小沈
query.setInteger(1, 3);//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接口
query.setString("name", "小沈");
query.setInteger("id", 3);
query.setParameter("name", "小沈");//setParameter()你不用判断到底是什么类型 了
query.setParameter("id", 3);
List<Customer> list = query.list();
System.out.println(list);*/
//查询的时候相当于两表关联,两表关联是通过外键关联的
Customer customer = new Customer();//
customer.setCid(1);//1号客户 这里只需要给Customer设置一个id即可
//持久化对象根据id可以唯一确定这个对象
//所以它的写法是相当的灵活的
List<Order> list = session.createQuery("from Order o where o.customer = ?").setEntity(0, customer).list();//设置的是一个实体类Customer
for (Order order : list) {
System.out.println(order);
} tx.commit();
session.close();
}
@Test
/*
*
*
*/
public void demo7(){
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
//HQL获取单个对象 这里你可以list()也可以uniqueResult() uniqueResult()就拿到了一个结果 /*Customer customer = (Customer) session.createQuery("from Customer where cname = ? ").setString(0, "小明").uniqueResult(); System.out.println(customer);*/ //QBC方式获取单个对象
//Customer customer = (Customer) session.createCriteria(Customer.class).setMaxResults(1).add(((Criteria) Restrictions.eq("cname", "小明")).uniqueResult();//session.createCriteria(Customer.class)查到所有。从0开始只查一个。
Customer customer = (Customer) session.createCriteria(Customer.class).add( Restrictions.eq("cname", "小明")).uniqueResult();//session.createCriteria(Customer.class)查到所有。从0开始只查一个。
//FirstResult是从哪儿开始,你没有设置的话它就默认从0开始。查1个。setMaxResults(1)查一个
System.out.println(customer);
tx.commit();
session.close();
}
@Test
/*
* 分页查询
*
*/
public void demo6(){
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction(); //1.HQL进行分页
/*Query query = session.createQuery("from Order");
//query.setFirstResult(0);
//query.setMaxResults(10); query.setFirstResult(10);
query.setMaxResults(10);
query.setFirstResult(20);
query.setMaxResults(10); List<Order> list = query.list();//查询订单的时候把它的客户也关联出来.这种是导航的形式,查询订单的时候把订单所关联的客户信息都打印出来
for (Order order : list) {
System.out.println(order);
}*/
//2.QBC进行分页
Criteria criteria = session.createCriteria(Order.class);
/* criteria.setFirstResult(0);
criteria.setMaxResults(10);*/
criteria.setFirstResult(10);
criteria.setMaxResults(10); List<Order> list = criteria.list();
for (Order order : list) {
System.out.println(order);
}
tx.commit();
session.close();
}
@Test
public void demo5(){
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
//1.使用HQL进行排序
/* List<Customer> list = session.createQuery("from Customer c order by c.id desc").list(); for(Customer customer : list){
System.out.println(customer);
}*/ //2.使用QBC的方式进行排序
List<Customer> list = session.createCriteria(Customer.class).addOrder(org.hibernate.criterion.Order.desc("id")).list();
for (Customer customer : list) {
System.out.println(customer);
} tx.commit();
session.close();
} @Test
/*
*
* 多态检索
*/
public void demo4(){
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
List<Object[]> list = session.createQuery("from java.lang.Object").list();
//System.out.println(list);
/* for(Object[] objects:list){
System.out.println(objects);//在hibernate3核心配置文件里面配置的映射继承自某个类就给它显示出来
}
*/
System.out.println(list);//在hibernate3核心配置文件里面配置的映射继承自某个类就给它显示出来
//正常HQL语句例如之前写的 from Customer c要加上包名from cn.itcast.vo.Customer.但是因为在Customer.hbm.xml
//中已经配置了包名.所以在这里的HQL语句已经知道是哪个包下面的Customer.
tx.commit();
session.close();
} @Test
/*
* 使用别名:
*
*/
public void demo3(){
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction(); //使用别名
//List<Customer> list = session.createQuery("from Customer as c where c.cname = ?").list();
/* List<Customer> list = session.createQuery("from Customer as 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);*/ //别名as可以省略
/* List<Customer> list = session.createQuery("from Customer c").list();
System.out.println(list);*/
//不支持 select * from Customer写法.可以写成select 别名 from Customer as 别名;
//List<Customer> list = session.createQuery("select * from Customer").list();//createQuery不支持select *的写法,会报语法错误
List<Customer> list = session.createQuery("select c from Customer c").list();//createQuery不支持select *的写法,会报语法错误 System.out.println(list);
tx.commit();
session.close();
} @Test
public void demo2(){
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction(); //1.使用HQL查询所有客户信息:
/* Query query = session.createQuery("from Customer");//"from Customer"是一个HQL语句。返回一个Query接口
query.list();
*
*/
//session.createQuery("from Customer").setString("", "").list();//HQL支持方法链编程
/* List<Customer> list = session.createQuery("from Customer").list();//HQL支持方法链编程
for(Customer customer:list){
System.out.println(customer);
}*/ //2.使用QBC的方式查询所有记录:
/* List<Customer> list= session.createCriteria(Customer.class).list();//返回Criteria接口
for (Customer customer:list){
System.out.println(customer);
}*/ //3.使用SQL语句查询所有记录:
/* List<Object[]> list = session.createSQLQuery("select * from customer").list();//这里要写SQL语句 这里操作的是数据库表
//但是HQL和QBC方式操作的都是对象 这种SQL查询的方式得到的List集合不会直接装到实体对象里面。而是放到Object数组中。
for(Object[] objects:list){
System.out.println(Arrays.toString(objects));//把Object数组打印一下
}*/
//4.使用SQL语句查询所有记录:封装到实体对象中
List<Customer> list = session.createSQLQuery("select * from customer").addEntity(Customer.class).list();//这里要写SQL语句 这里操作的是数据库表
//但是HQL和QBC方式操作的都是对象 这种SQL查询的方式得到的List集合不会直接装到实体对象里面。而是放到Object数组中。这也是方法链编程
for(Customer customer:list){
System.out.println(customer);//这个时候就是打印出实体对象的方式
}
tx.commit();
session.close();
}
@Test
/*
*
* 初始化数据
*/
public void demo1(){
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction(); Customer customer = new Customer();
//customer.setCname("小金");
//customer.setCname("小明");
customer.setCname("小沈"); for(int i=0;i<=10;i++){
Order order = new Order();
//order.setAddr("西三旗"+i);
order.setAddr("山东"+i);
order.setCustomer(customer); customer.getOrders().add(order);
}
session.save(customer);
//还需要设置订单,如果不想设置订单那就要配置级联才行
tx.commit();
session.close();
}
}

所以可以用这种离线条件查询做这种高级的查询的方式。

如果是条件特别复杂,建议使用QBC;如果是操作比较简单,那就使用HQL;

day36 05-Hibernate检索方式:离线条件查询的更多相关文章

  1. 分页离线条件查询 页面响应500 后端未报异常 list集合有数据

    如果 使用同一个Hibernate的DetachedCriteria离线条件查询对象同时查询“过滤后条数” 和 “过滤后的数据集合”,那么查询记录数时需要设置聚合函数条件并且 使用聚合函数  代码要在 ...

  2. Hibernate入门6.Hibernate检索方式

    Hibernate入门6.Hibernate检索方式 20131128 代码下载 链接: http://pan.baidu.com/s/1Ccuup 密码: vqlv Hibernate的整体框架已经 ...

  3. (转) Hibernate检索方式概述

    http://blog.csdn.net/yerenyuan_pku/article/details/70554816 Hibernate检索方式概述 我们在对数据库的操作中,最常用的是select, ...

  4. hibernate--DetachedCriteria(离线条件查询)

    一.叙述 离线条件查询的好处,可以在非dao层封装查询参数,封装完成后,将对象传递到dao层,关联到session后,再去查询数据,这样做dao层可以极大的简化代码.下面通过一个小案例,一起来感受一下 ...

  5. hibernate检索方式(HQL 检索方式,QBC 检索方式,本地 SQL 检索方式)

    hibernate有五种检索方式,这儿用 单向的一对多的映射关系 例子,这儿有后三种的方式: 导航对象图检索方式: 根据已经加载的对象导航到其他对象 OID 检索方式: 按照对象的 OID 来检索对象 ...

  6. Hibernate 检索方式

    概述 •Hibernate 提供了以下几种检索对象的方式 –导航对象图检索方式:  根据已经加载的对象导航到其他对象 –OID 检索方式:  按照对象的 OID 来检索对象 –HQL 检索方式: 使用 ...

  7. [原创]java WEB学习笔记89:Hibernate学习之路-- -Hibernate检索方式(5种),HQL介绍,实现功能,实现步骤,

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  8. Hibernate检索方式 分类: SSH框架 2015-07-10 22:10 4人阅读 评论(0) 收藏

    我们在项目应用中对数据进行最多的操作就是查询,数据的查询在所有ORM框架中也占有极其重要的地位.那么,如何利用Hibernate查询数据呢?Hibernate为我们提供了多种数据查询的方式,又称为Hi ...

  9. QBC查询、离线条件查询(DetachedCriteric)和分页查询模版

    一.QBC检索步骤 QBC检索步骤: 1.调用Session的createCriteria()方法创建一个Criteria对象. 2.设定查询条件.Expression类提供了一系列用于设定查询条件的 ...

随机推荐

  1. localStorage,sessionStorage,cookie区别

    localStorage:HTML5新增的在浏览器端存储数据的方法.设置和获取localStorage的方法: 设置: localStorage.name = 'zjj'; 获取: localStor ...

  2. JavaScript学习笔记:数组的indexOf()和lastindexOf()方法

    https://www.w3cplus.com/javascript/array-part-6.html

  3. php数据结构课程---5、树(树的 存储方式 有哪些)

    php数据结构课程---5.树(树的 存储方式 有哪些) 一.总结 一句话总结: 双亲表示法:data parent:$tree[1] = ["B",0]; 孩子表示法:data ...

  4. opencv-访问Mat中每个像素的值

    参考:[OpenCV]访问Mat中每个像素的值(新)   膜拜大佬 以下例子代码均针对8位单通道灰度图. 1 .ptr和[]操作符 Mat最直接的访问方法是通过.ptr<>函数得到一行的指 ...

  5. [原创]新版PageOffice V4.0为什么用弹出窗口的方式打开文件?

    前的包含文档处理功能的Web办公系统,在打开文档的时候,一部分系统是采用Office文档嵌入到主窗口页面中右侧工作区域的方式,另一部分系统采用的是弹出新的浏览器窗口,里面完整的嵌入Office文件的打 ...

  6. Python学习之enumerate

         enumerate还可以接收第二个参数,用于指定索引起始值   2.     注意open返回文件对象,可迭代,而os.open返回的是文件指针,int类型, <wiz_tmp_tag ...

  7. Lombock原理

    说道Lombok,可能会鲜为人知.但是在实际的开发中,它起到了很大的作用,话不多说,直入正题: 一.Lombok是什么 现在看一下Lombok官方对其进行的解释:Lombok官网:https://pr ...

  8. Django项目:CMDB(服务器硬件资产自动采集系统)--05--05CMDB采集硬件数据的插件

    #__init__.py # ————————05CMDB采集硬件数据的插件———————— from config import settings import importlib # —————— ...

  9. git简单使用命令

    每次都会忘记git使用命令 在本上做了笔记,网上也备份一份吧 这个是删除步骤: 拉取远程的Repo到本地(如果已经在本地,可以略过) $ git clone xxxxxx 在本地仓库删除文件  $ g ...

  10. 深入浅出 Java Concurrency (16): 并发容器 part 1 ConcurrentMap (1)[转]

    从这一节开始正式进入并发容器的部分,来看看JDK 6带来了哪些并发容器. 在JDK 1.4以下只有Vector和Hashtable是线程安全的集合(也称并发容器,Collections.synchro ...