zoukankan      html  css  js  c++  java
  • hibernate检索

    检索策略

    类级别检索策略:
    	lazy:默认是true,表示懒加载
    		     若为false,则是直接加载
    		     >>若使用get方法:则lazy不起作用,都会直接发送sql语句
    		     >>若使用load方法:则会进行懒加载,直到访问对象的非id属性时才会select语句
    set标签中的检索策略: <set name="set" table="ORDERS" inverse="true" lazy="true" batch-size="3" fetch="join">
    	lazy:默认是true,表示懒加载
    			>>用set属性时才查询
    		     若为false
    		    >>查询Customer时,连发两条select语句,第一句查Customer,第二句查set
    		     若为extra,则表示增强懒加载,尽可能延迟初始化的时机,
    		     		  比如size()时	select
    								        count(ORDER_ID) 
    								    from
    								        ORDERS 
    								    where
    								        CUSTOMER_ID =?
    	batch-size:批量处理用来为延迟检索策略或立即检索策略设定批量检索的数量.(extra增强懒加载不适用) 
    			     批量检索能减少 SELECT 语句的数目, 提高延迟检索或立即检索的运行性能. 
    			     	一次处理两个时
    			      	select
    				        set0_.CUSTOMER_ID as CUSTOMER3_0_1_,
    				        set0_.ORDER_ID as ORDER_ID1_1_1_,
    				        set0_.ORDER_ID as ORDER_ID1_1_0_,
    				        set0_.ORDER_DESC as ORDER_DE2_1_0_,
    				        set0_.CUSTOMER_ID as CUSTOMER3_1_0_ 
    				    from
    				        ORDERS set0_ 
    				    where
    				        set0_.CUSTOMER_ID in (
    				            ?, ?
    				        )	
    			     若为增强懒加载,则不起作用
    	fetch:默认是select:就是正常,简单的select查询
    	
    		  当 fetch 属性为 “subselect” 时
    			1.假定 Session 缓存中有 n 个 orders 集合代理类实例没有被初始化, 
    			  Hibernate 能够通过带子查询的 select 语句, 来批量初始化 n 个 orders 集合代理类实例
    			2.batch-size 属性将被忽略
    			3.子查询中的 select 语句为查询 CUSTOMERS 表 OID 的 SELECT 语句
    		  
    		  当 fetch 属性为 “join” 时:
    			1.检索 Customer 对象时, 会采用迫切左外连接(通过左外连接加载与检索指定的对象关联的对象)
    			     策略来检索所有关联的 Order 对象
    			2.lazy 属性将被忽略
    			3.Query 的list() 方法会忽略映射文件中配置的迫切左外连接检索策略, 而依旧采用延迟加载策略
     <many-to-one>和<one-to-one>同上		  
    	
    	
    

    检索方法

    1.HQL

    package jiansuo_jiben;
    
    import java.util.Arrays;
    import java.util.Iterator;
    import java.util.List;
    
    import org.hibernate.Query;
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.Transaction;
    import org.hibernate.cfg.Configuration;
    import org.hibernate.service.ServiceRegistry;
    import org.hibernate.service.ServiceRegistryBuilder;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    public class TestHQL {
    	private SessionFactory sessionFactory;
    	private Session session;
    	private Transaction transaction;
    	
    	@Before
    	public void before(){
    		Configuration configuration = new Configuration().configure();
    		ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties())
    																		.buildServiceRegistry();
    		sessionFactory = configuration.buildSessionFactory(serviceRegistry);
    		session  = sessionFactory.openSession();
    		transaction = session.beginTransaction();
    	}
    
    	@After
    	public void after(){
    		transaction.commit();
    		session.close();
    		sessionFactory.close();
    	}
    
    	@Test
    	public void test() {
    		Query query = session.createQuery("FROM Employee where salary >= :sal and"
    				+ " department = :dep order by salary asc");
    		
    		Department d = new Department();
    		d.setId(1);
    		query.setInteger("sal", 500).setEntity("dep", d);
    		
    		List<Employee> es = query.list();
    		System.out.println(es);
    		Iterator<Employee> it = es.iterator();
    		while(it.hasNext()){
    			System.out.println(it.next().getName());
    		}
    	}
    
    	@Test
    	public void testPageQuery() {//分页查询
    		Query q = session.createQuery("FROM Employee ORDER BY salary desc");
    		
    		int pageNo = 1;//第几页,从1开始
    		int pageSize = 3;//每页几条记录
    		
    		
    		q.setFirstResult( (pageNo-1) * pageSize );//设置第一条记录的位置
    		q.setMaxResults(pageSize);//设置每页的记录条数
    		
    		List<Employee> es = q.list();
    		for(Employee e:es){
    			System.out.println(e);
    		}
    	}
    	@Test
    	public void testNameQuery() {//命名查询,在hbm.xml文件中写hql
    //<query name="minSalaryAsDepartment"><![CDATA[SELECT min(e.salary) FROM Employee e GROUP BY e.department]]></query>
    		Query q = session.getNamedQuery("minSalaryAsDepartment");//引用
    		
    //		Department dep = new Department();
    //		dep.setId(2);
    //		
    //		q.setEntity("dep", dep);
    		
    		List<Integer> mins = q.list();
    		System.out.println(mins);
    	}
    	@Test
    	public void testFieldQuery() {//字段查询,要用对应的构造方法,也可不封装
    		String hql = "SELECT new Employee(e.salary,e.name,e.department) FROM Employee e WHERE e.department = :dep";
    		
    		Department dep = new Department();
    		dep.setId(1);
    		
    		Query q = session.createQuery(hql);
    		q.setEntity("dep", dep);
    		
    		List<Employee> os = q.list();
    		
    		for(Employee o:os){
    			System.out.println(o);
    		}
    	}
    	@Test
    	public void test_baobiao_Query() {//报表查询,使用对应的方法
    		String hql = "SELECT min(e.salary),max(e.salary) FROM Employee e WHERE e.salary>100 GROUP BY e.department";
    		
    		
    		Query q = session.createQuery(hql);
    		
    		List<Object[]> os = q.list();
    		
    		for(Object[] o:os){
    			System.out.println(Arrays.asList(o));
    		}
    	}
    }
    

    2.QBC

    package jiansuo_jiben;
    
    import java.sql.SQLException;
    import java.util.Iterator;
    import java.util.List;
    
    import org.hibernate.Criteria;
    import org.hibernate.Query;
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.Transaction;
    import org.hibernate.cfg.Configuration;
    import org.hibernate.criterion.Conjunction;
    import org.hibernate.criterion.Disjunction;
    import org.hibernate.criterion.MatchMode;
    import org.hibernate.criterion.Order;
    import org.hibernate.criterion.Projections;
    import org.hibernate.criterion.Restrictions;
    import org.hibernate.jdbc.Work;
    import org.hibernate.service.ServiceRegistry;
    import org.hibernate.service.ServiceRegistryBuilder;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    public class TestQBC_SQL_Cache {
    	private SessionFactory sessionFactory;
    	private Session session;
    	private Transaction transaction;
    	
    	@Before
    	public void before(){
    		Configuration configuration = new Configuration().configure();
    		ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties())
    																		.buildServiceRegistry();
    		sessionFactory = configuration.buildSessionFactory(serviceRegistry);
    		session  = sessionFactory.openSession();
    		transaction = session.beginTransaction();
    	}
    
    	@After
    	public void after(){
    		transaction.commit();
    		session.close();
    		sessionFactory.close();
    	}
    	
    	@Test
    	public void testQBC4(){
    		Criteria criteria = session.createCriteria(Employee.class);
    		
    		//1. 添加排序
    		criteria.addOrder(Order.asc("salary"));
    		criteria.addOrder(Order.desc("name"));
    		
    		//2. 添加翻页方法
    		int pageSize = 5;
    		int pageNo = 3;
    		List<Employee> es = criteria.setFirstResult((pageNo - 1) * pageSize)
    		        .setMaxResults(pageSize)
    		        .list();
    		for(Employee e:es){
    			System.out.println(e);
    		}
    	}
    	
    	@Test
    	public void testQBC3(){//跟报表查询差不多
    		Criteria criteria = session.createCriteria(Employee.class);
    		
    		//统计查询: 使用 Projection 来表示: 可以由 Projections 的静态方法得到
    		criteria.setProjection(Projections.max("salary"));
    		
    		System.out.println(criteria.uniqueResult()); //50000
    	}
    	
    	@Test
    	public void testQBC2(){
    		Criteria criteria = session.createCriteria(Employee.class);
    		
    		//1. AND: 使用 Conjunction 表示
    		//Conjunction 本身就是一个 Criterion 对象
    		//且其中还可以添加 Criterion 对象
    		Conjunction conjunction = Restrictions.conjunction();
    		conjunction.add(Restrictions.like("name", "a", MatchMode.ANYWHERE));
    		Department dept = new Department();
    		dept.setId(80);
    		conjunction.add(Restrictions.eq("department", dept));
    		System.out.println(conjunction); 
    		
    		//2. OR
    		Disjunction disjunction = Restrictions.disjunction();
    		disjunction.add(Restrictions.le("salary", 6000));
    		disjunction.add(Restrictions.isNull("name"));
    		
    		System.out.println(disjunction);
    		
    		criteria.add(disjunction);
    		criteria.add(conjunction);
    		
    		criteria.list();
    	}
    	
    	@Test
    	public void testQBC(){
    		//1. 创建一个 Criteria 对象
    		Criteria criteria = session.createCriteria(Employee.class);
    		
    		//2. 添加查询条件: 在 QBC 中查询条件使用 Criterion 来表示
    		//Criterion 可以通过 Restrictions 的静态方法得到
    		criteria.add(Restrictions.eq("email", "SKUMAR"));
    		criteria.add(Restrictions.gt("salary", 5000F));
    		
    		//3. 执行查询
    		Employee employee = (Employee) criteria.uniqueResult();
    		System.out.println(employee); 
    	}
    }
    

    3.本地SQL

    package jiansuo_jiben;
    
    import java.sql.SQLException;
    import java.util.Iterator;
    import java.util.List;
    
    import org.hibernate.Criteria;
    import org.hibernate.Query;
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.Transaction;
    import org.hibernate.cfg.Configuration;
    import org.hibernate.criterion.Conjunction;
    import org.hibernate.criterion.Disjunction;
    import org.hibernate.criterion.MatchMode;
    import org.hibernate.criterion.Order;
    import org.hibernate.criterion.Projections;
    import org.hibernate.criterion.Restrictions;
    import org.hibernate.jdbc.Work;
    import org.hibernate.service.ServiceRegistry;
    import org.hibernate.service.ServiceRegistryBuilder;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    public class TestQBC_SQL_Cache {
    	private SessionFactory sessionFactory;
    	private Session session;
    	private Transaction transaction;
    	
    	@Before
    	public void before(){
    		Configuration configuration = new Configuration().configure();
    		ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties())
    																		.buildServiceRegistry();
    		sessionFactory = configuration.buildSessionFactory(serviceRegistry);
    		session  = sessionFactory.openSession();
    		transaction = session.beginTransaction();
    	}
    
    	@After
    	public void after(){
    		transaction.commit();
    		session.close();
    		sessionFactory.close();
    	}
    	
    	@Test
    	public void testHQLUpdate(){
    		String hql = "DELETE FROM Department d WHERE d.id = :id";
    		
    		session.createQuery(hql).setInteger("id", 280)
    		                        .executeUpdate();
    	}
    	
    	@Test
    	public void testNativeSQL(){
    		String sql = "INSERT INTO gg_department VALUES(?, ?)";
    		Query query = session.createSQLQuery(sql);
    		
    		query.setInteger(0, 280)
    		     .setString(1, "ATGUIGU")
    		     .executeUpdate();
    	}
    }

      

  • 相关阅读:
    beautiful number 数位DP codeforces 55D
    最长上升子序列
    0-1背包 codeforces 55 D
    概率DP HDU 4586 play the dice
    水题 不要62 HDU 2089
    抓老鼠 codeForce 148D
    ZOJ 3551 吸血鬼 概率DP
    poj 2151 Check the difficulty of problems 概率DP
    HDU 4681 string 求最长公共子序列的简单DP+暴力枚举
    HDU 1814 模板题 2-sat
  • 原文地址:https://www.cnblogs.com/feifeiyun/p/6476403.html
Copyright © 2011-2022 走看看