Hibernate的查询方式
Hibernate的查询的方式
OID检索
get或load方法进行的查询
对象导航检索
linkman.getCustomer();
HQL检索
用于接收hql语句进行查询,面向对象查询方式。
通过session.createQuery(String hql);
简单查询
1 @Test 2 public void fun1() { 3 //获取session 4 Session session = HibernateUtils.openSession(); 5 //打开事务 6 Transaction tx=session.beginTransaction(); 7 //-------------------------------------- 8 //完整写法 9 String hql1="from cn.itheima.domain.Customer"; 10 //简单写法 11 String hql2="from Custom"; 12 //扩展写法 13 //如果用这种写法对象是Object,接收对象List不用泛型 14 String hql3="from java.lang.object"; 15 Query query = session.createQuery(hql1); 16 17 List<Customer> list=query.list(); 18 19 System.out.println(list); 20 //-------------------------------------- 21 //提交事务 22 tx.commit(); 23 //关闭session 24 session.close(); 25 26 }
别名查询
排序查询
1 @Test 2 //排序 3 public void fun2() { 4 //获取session 5 Session session = HibernateUtils.openSession(); 6 //打开事务 7 Transaction tx=session.beginTransaction(); 8 //-------------------------------------- 9 //完整写法 10 String hql1="from cn.itheima.domain.Customer order by cust_id asc"; 11 String hql2="from cn.itheima.domain.Customer order by cust_id desc"; 12 Query query = session.createQuery(hql1); 13 14 List<Customer> list=query.list(); 15 //query.setParameter("id", 2l); 16 17 System.out.println(list); 18 //-------------------------------------- 19 //提交事务 20 tx.commit(); 21 //关闭session 22 session.close(); 23 24 }
条件查询
分组统计查询
投影查询
1 @Test 2 //投影查询 3 public void fun5() { 4 //获取session 5 Session session = HibernateUtils.openSession(); 6 //打开事务 7 Transaction tx=session.beginTransaction(); 8 //-------------------------------------- 9 //完整写法 10 String hql1="select cust_name from cn.itheima.domain.Customer "; 11 String hql2="select cust_name,cust_id from cn.itheima.domain.Customer "; 12 String hql3="select new Customer(cust_name,cust_id) from cn.itheima.domain.Customer "; 13 14 Query query = session.createQuery(hql2); 15 16 List<Object[]> list = query.list(); 17 System.out.println(list); 18 //-------------------------------------- 19 //提交事务 20 tx.commit(); 21 //关闭session 22 session.close(); 23 }
分页查询
1 @Test 2 //分页 3 public void fun3() { 4 //获取session 5 Session session = HibernateUtils.openSession(); 6 //打开事务 7 Transaction tx=session.beginTransaction(); 8 //-------------------------------------- 9 //完整写法 10 String hql1="from cn.itheima.domain.Customer order by cust_id asc"; 11 String hql2="from cn.itheima.domain.Customer order by cust_id desc"; 12 Query query = session.createQuery(hql1); 13 14 //(当前页数-1)*每页条数 15 query.setFirstResult(0); 16 query.setMaxResults(2); 17 //query.setParameter("id", 2l); 18 19 20 List<Customer> list=query.list(); 21 22 System.out.println(list); 23 //-------------------------------------- 24 //提交事务 25 tx.commit(); 26 //关闭session 27 session.close(); 28 }
多表查询
QBC检索
用于进行条件查询(Query By Criteria),更加面向对象的方式。
通过session.createCriteria(Class clazz);
1 @Test 2 //基本语法 3 //注意此时生成ToString方法 4 public void fun1() { 5 //获取session 6 Session session = HibernateUtils.openSession(); 7 //打开事务 8 Transaction tx=session.beginTransaction(); 9 //-------------------------------------- 10 //完整写法 11 Criteria c = session.createCriteria(Customer.class); 12 13 List<Customer> list =c.list(); 14 System.out.println(list); 15 16 17 //-------------------------------------- 18 //提交事务 19 tx.commit(); 20 //关闭session 21 session.close(); 22 23 }
简单查询
排序查询
1 @Test 2 //排序语法 3 public void fun4() { 4 //获取session 5 Session session = HibernateUtils.openSession(); 6 //打开事务 7 Transaction tx=session.beginTransaction(); 8 //-------------------------------------- 9 //完整写法 10 11 Criteria c = session.createCriteria(Customer.class); 12 13 //c.addOrder(Order.asc("cust_id"));//升序 14 c.addOrder(Order.desc("cust_id"));//降序 15 16 17 List<Customer> list=c.list(); 18 System.out.println(list); 19 20 //-------------------------------------- 21 //提交事务 22 tx.commit(); 23 //关闭session 24 session.close(); 25 }
分组统计查询
分页查询
1 @Test 2 //分页语法-与HQL一样 3 public void fun3() { 4 //获取session 5 Session session = HibernateUtils.openSession(); 6 //打开事务 7 Transaction tx=session.beginTransaction(); 8 //-------------------------------------- 9 Criteria c=session.createCriteria(Customer.class); 10 //limit ?,? 11 c.setFirstResult(0); 12 c.setMaxResults(2); 13 14 List<Customer> list =c.list(); 15 System.out.println(list); 16 17 18 19 //-------------------------------------- 20 //提交事务 21 tx.commit(); 22 //关闭session 23 session.close(); 24 }
条件查询
离线条件查询
1 @Test 2 //基本语法 3 //注意此时生成ToString方法 4 public void fun1() { 5 //service/web层 6 DetachedCriteria dc=DetachedCriteria.forClass(Customer.class); 7 8 dc.add(Restrictions.idEq(61));//瓶装条件(全部与普通Criteria一致) 9 //获取session 10 Session session = HibernateUtils.openSession(); 11 //打开事务 12 Transaction tx=session.beginTransaction(); 13 //-------------------------------------- 14 Criteria c=dc.getExecutableCriteria(session); 15 List list=c.list(); 16 System.out.println(list); 17 18 19 20 //-------------------------------------- 21 //提交事务 22 tx.commit(); 23 //关闭session 24 session.close(); 25 26 27 }
SQL检索
用于接收sql进行查询。
通过session.createSQLQuery(String sql);
Hibernate的抓取策略(优化)
延迟加载
类级别 在<class>上配置lazy属性
关联级别 在<set>、<many-to-one>上配置的lazy属性
抓取策略
Set上的fetch和lazy
fetch :
select
join
subselect
lazy :
true
false
extra
many-to-one上fetch和lazy
fetch
select
join
lazy
proxy
false
no-proxy
结论:为了提高效率.fetch的选择上应选择select. lazy的取值应选择 true. 全部使用默认值.