本文主要是介绍Hibernate 导航对象、OID、HQL、QBC、SQL检索方式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Hibernate的检索方式
一、导航对象检索
二、OID检索
三、HQL检索
四、QBC检索
五、SQL检索:
一、导航对象检索:
- 概述:根据已经加载的对象导航到其他的对象。例如可以根据订单的信息找到客户的相关信息
Order order = session.get(Order.Class,1l);
Customer customer = order.getCustomer();
二、OID检索:
- 概述:利用session的get()、load()方法检索某条记录对应的对象
- get()与load方法的区别:
* get方法
* * 采用的是立即加载,执行到这行代码的时候,就会马上发送SQL语句去查询。
* * 查询后返回是真实对象本身。
* * 查询一个找不到的对象的时候,返回null
*
* load方法
* * 采用的是延迟加载,执行到这行代码的时候,不会发送SQL语句,当真正使用这个对象的时候才会发送SQL语句。
* * 查询后返回的是代理对象。javassist-3.18.1-GA.jar 利用javassist技术产生的代理。
* * 查询一个找不到的对象的时候,返回ObjectNotFoundException
Order order = session.get(Order.Class,1l);
Order order = session.load(Order.Class,1l);
三、HQL检索:
概述:面向对象的查询语言,和SQL语言有些类似,但它使用的是类、对象和属性,没有表和字段的概念
1.HQL简单查询:
1.1查询所有的Customer
Query query = session.createQuery("from com.jjxy.hibernate.Customer");
List<Customer> list = query.list();
1.2HQL 别名查询
Query query = session.createQuery("from com.jjxy.hibernate.Customer c");
或者
Query query = session.createQuery("select c from com.jjxy.hibernate.Customer c");
List<Customer> list = query.list();
2.HQL排序查询:降序(desc)、默认.....升序(asc),利用关键字 order by
Query query = session.createQuery("from Customer order by cust_id desc");
List<Customer> list = query.list();
3.HQL条件查询:位置绑定、名称绑定查询两种
3.1位置绑定
3.1.1单个条件查询
ry = session.createQuery("from Customer where cust_name=?");
query.setParameter(0,"小李")
List<Customer> list = query.list();
3.1.2多个条件查询 (绑定多个参数,用Query对象的setParameter()方法设置查询值)
Query query = session.createQuery("from Customer where cust_name=? and cust_source like ?");
query.setParameter(0,"小李");
query.setParameter(1,"微信");
List<Customer> list = query.list();
3.2名称绑定查询
Query query = session.createQuery("from Customer where cust_name= :cust_name and cust_source like:cust_source");
query.setParameter("cust_name","小李");
query.setParameter("cust_source","微信");
List<Customer> list = query.list();
4. HQL的投影查询:查询某个对象的某个或某些属性
4.1查询某个属性 :将它们可以保存在List的Object集合中
List<Object> list = session.createQuery("select c.cust_name from Customer c").list();
4.2查询多个属性:多个属性要保存,可以选择保存在List的Object数组集合中
List<Object[]> list = session.createQuery("select c.cust_name,c.cust_source from Customer c").list();
for(Object[] object :list){System.out.println(Arrays.toString(object));
}
4.2.1查询多个属性封装到原有的对象中去:查询哪些属性就要在实体类中设置其属性的有参、无参构造方法。
List<Customer> list1 = session.createQuery("select new Customer(cust_name,cust_source) from Customer").list();
for(Customer customer:list1){System.out.println(customer);
}
5.HQL的分页查询 : setFirstResult()、 setMaxResults()
Query query = session.createQuery("from LinkMan");
query.setFirstResult(0);
query.setMaxResults(10);
List<LinkMan> list = query.list();
6.HQL的分页统计查询
6.1统计查询 : 聚合函数的使用 ........count,max,min,avg,sum
Long l = (Long)session.createQuery("select count(*) from Customer").uniqueResult();
System.out.println(l);
6.2 分组查询 :group by (having count(*)>=1)....设置记录数限制
List<Object[]> objects= session.createQuery("select cust_source,count (*) from Customer group by cust_source having count(*) >=1").list();
for (Object[] objects1:objects){System.out.println(Arrays.toString(objects1));
}
四、QBC检索
概述:(Query By Criteria),主要由Criteria接口实现
1.QBC简单查询
Criteria criteria = session.createCriteria(Customer.class);
List<Customer> list = criteria.list();
2.排序查询:addOrader()
Criteria criteria = session.createCriteria(Customer.class);
List<Customer> list = criteria.addOrder(Order.desc("cust_id")).list();
3.分页查询
Criteria criteria = session.createCriteria(LinkMan.class);
criteria.setFirstResult(10);
criteria.setMaxResults(10);
List<LinkMan> list = criteria.list();
4.条件查询 :add()
Criteria criteria = session.createCriteria(Customer.class);//设置条件/** = eq* > gt* >= ge* < lt* <= le* <> ne* like* in* and* or* */criteria.add(Restrictions.eq("cust_source","微信"));/*设置第二个并列的条件*/criteria.add(Restrictions.like("cust_name","%李"));List<Customer> list = criteria.list();
5.统计查询
Criteria criteria = session.createCriteria(Customer.class);
/** add :普通的条件查询* addOrder :排序* setProjection :聚合函数* */
Long aLong = (Long) criteria.setProjection(Projections.rowCount()).uniqueResult();
System.out.println(aLong);
6.离线查询 :DetachedCriteria对象
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Customer.class);
/*模拟业务层传来的数据*/
detachedCriteria.add(Restrictions.like("cust_name","%李"));
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();Criteria c = detachedCriteria.getExecutableCriteria(session);
List<Customer> list = c.list();
for(Customer customer:list){System.out.println(customer);
}
tx.commit();
五、SQL检索:
1.将查询的SQLQuery封装至对象中: ........addEntity()方法
public void demo(){Session session = HibernateUtils.getCurrentSession();Transaction tx = session.beginTransaction();SQLQuery sqlQuery = session.createSQLQuery("select *from cst_customer");/* List<Object[]> list = sqlQuery.list();for(Object[] objects:list){System.out.println(Arrays.toString(objects));}*//*将SQLQuery封装至对象中*/sqlQuery.addEntity(Customer.class);List<Customer> list = sqlQuery.list();for(Customer customer:list){System.out.println(customer);}tx.commit();}
这篇关于Hibernate 导航对象、OID、HQL、QBC、SQL检索方式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!