检索策略
类级别检索策略: 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(); } }