Hibernate -- 检索方式 HQL
Hibernate 提供了以下几种检索对象的方式
导航对象图检索方式: 根据已经加载的对象导航到其他对象
OID 检索方式: 按照对象的OID 来检索对象
HQL 检索方式:使用面向对象的HQL查询语言
QBC 检索方式:使用QBC(Query By Criteria) API来检索对象.这种API 封装了基于字符串形式的查询语句,提供了更加面向对象的查询接口.
本地 SQL 检索方式:使用本地数据库的SQL 查询语句
知识点4: 多态查询(是指查询出当前类及所有子类的实例)
知识点6: 分页查询
setFirstResult(int firstResult): 设定从哪一个对象开始检索,参数 firstResult 表示这个对象在查询结果中的索引位置, 索引位置的起始值为 0. 默认情况下, Query从查询结果中的第一个对象开始检索
setMaxResult(int maxResults): 设定一次最多检索出的对象的数目.在默认情况下, Query 和 Criteria 接口检索出查询结果中所有的对象
知识点10: 迫切左外连接
//left outer join fetch 表示迫切左外连接检索策略
//Query方法返回的集合中存放Customer对象的引用,每个Customer对象的orders集合都被初始化
知识点11: 左外连接
//left outer join 左外连接,使用左外连接查询时,将根据映射文件的配置来决定
// orders集合的检索策略 返回是对象数组
知识点12: 内连接
HQL查询:默认检索的是成对的对象Customer和Order。返回是对象数组
知识点13: 迫切内连接
//Inner join fetch表示迫切内连接检索策略,也就是覆盖映射文件中指定的检索策略
知识点15: 右连接
HQL: right outer join 右外连接 返回是对象数组
知识点17:投影查询
from Customer c join c.orders o where o.orderNumber like ‘T%’ 如果希望查询结果中只包含Customer对象,可使用以下形式: select c from Customer c join c.orders o where o.orderNumber like T%’ --------------------------------------------------------------------------------- Select关键字还能用于选择对象的部分属性 session.createQuery(“select c.id,c.name,o.orderNumber from Customer c join c.orders o where o.orderNumber like ‘T%’”) 对应的sql语句为: select c.ID,c.NAME,o.ORDER_NUMBER from CUSTOMERS c inner join ORDERS o on c.ID-=o.CUSTOMER_ID where o.ORDER_NUMBER like’T%’ ------------------------------------------------------------------------------------ 过滤重复元素 createQuery(“select distinct c.name from customer c”);
Query query = session.createQuery("select " new cn.itcast.one2manySearch.CustomerRow(c.id,c.name,o.orderNumber) " + " from Customer c join c.orders o where o.orderNumber like '%NO1%'");
知识点18:报表查询
使用聚集函数 Query query = session.createQuery("select count(*) from Customer c"); //Integer count=(Integer)query.uniqueResult(); //System.out.println("count "+count); /***********************************************************/ //Query query = session.createQuery("select avg(c.age) from Customer c"); // Float avg=(Float)query.uniqueResult(); // System.out.println("avg "+avg); /***********************************************************/ //Query query = session.createQuery("select max(c.age),min(c.age) from Customer c"); // Object[] maxmin=(Object[])query.uniqueResult(); // System.out.println("max "+(Long)maxmin[0]); // System.out.println("min "+(Long)maxmin[1]); /***********************************************************/ //Query query = session.createQuery("select sum(c.age) from Customer c"); // Long sum=(Long)query.uniqueResult(); // System.out.println("sum "+sum); //分组 List list=session.createQuery("select c.name,count(c) from Customer c group by c.name").list(); System.out.println(list.size());
示例代码:
public class AppFind { private static SessionFactory sf = null; static { Configuration config = new Configuration(); config.configure("cn/itcast/search/hibernate.cfg.xml"); config.addClass(Customer.class); config.addClass(Order.class); sf = config.buildSessionFactory(); } @SuppressWarnings({ "unused", "unchecked" }) @Test public void Search(){ Session session=sf.openSession(); Transaction tx=session.beginTransaction(); /********************************************************************************************************/ //知识点1: 简单的查询 //使用hql查询 query hql查询接口 // Query query=session.createQuery("from Customer c where c.name='tom'"); // List<Customer> list=query.list(); // //使用qbc Criteria标注化查询接口 // Criteria cr=session.createCriteria(Customer.class); // // //每个Criterion对象表示一个查询条件 // Criterion cn=Restrictions.eq("name", "tom"); // // //增加条件 // cr.add(cn); // List<Customer> list=cr.list(); /********************************************************************************************************/ //知识点4: 多态查询(是指查询出当前类及所有子类的实例) // Query query=session.createQuery("from Customer c "); // query.list(); // Query query=session.createQuery("from java.io.Serializable o"); // query.list(); // Query query=session.createQuery("from java.lang.Object o"); // query.list(); /********************************************************************************************************/ //知识点5: 对查询结果排序 // Query query=session.createQuery("from Customer c order by c.id desc"); // query.list(); //使用qbc Criteria标注化查询接口 // Criteria cr=session.createCriteria(Customer.class); // cr.addOrder(org.hibernate.criterion.Order.desc("id")); // cr.list(); /********************************************************************************************************/ //知识点6: 分页查询 //使用hql // Query query=session.createQuery("from Order o order by o.id desc"); // query.setFirstResult(0); // query.setMaxResults(10); // query.list(); // //使用qbc // Criteria cr=session.createCriteria(Order.class); // cr.addOrder(org.hibernate.criterion.Order.desc("id")); // cr.setFirstResult(0); // cr.setMaxResults(10); // cr.list(); /********************************************************************************************************/ //知识点7: 检索单个对象 //使用hql // Query query=session.createQuery("from Customer c where c.name='tom'"); // query.setMaxResults(1); // query.uniqueResult(); //使用qbc // Criteria cr=session.createCriteria(Customer.class); // Criterion cn=Restrictions.eq("name", "tom"); // cr.add(cn); // cr.setMaxResults(1); // cr.uniqueResult(); /********************************************************************************************************/ //知识点8_1: 绑定参数的形式,按参数名称绑定 //:cname :cage表示参数的名称 // Query query=session.createQuery("from Customer c where c.name=:cname and c.age=:cage"); // //第一个参数代表名字,第二个参数代表值 // query.setString("cname", "tom"); // query.setInteger("cage", 32); // query.list(); /********************************************************************************************************/ //知识点8_2: 绑定参数的形式,按参数位置绑定 // Query query=session.createQuery("from Customer c where c.name=? and c.age=?"); // //第一个参数代表名字,第二个参数代表值 // query.setString(0, "tom"); // query.setInteger(1, 32); // query.list(); /********************************************************************************************************/ //知识点9: 在映射文件中定义命名查询语句 /* * <query name="fingCustomerByName"> <![CDATA[from Customer c where c.name like ?]]> </query> */ // Query query=session.getNamedQuery("fingCustomerByName"); // query.setString(0, "%t%"); // query.list(); // /********************************************************************************************************/ //知识点10: 迫切左外连接 //left outer join fetch 表示迫切左外连接检索策略 //返回的list集合存放的Customer对象,而Customer对象同时有关联到订单集合 //hql的语法会覆盖映射文件中 // Query query=session.createQuery("from Customer c left outer join fetch c.orderes where c.name like ?"); // query.setString(0, "%tom%"); // List<Customer> list=query.list(); // for(int i=0;i<list.size();i++){ // Customer c=list.get(i); // System.out.println(c.getId()+" "+c.getName()+"****************************************"); // // Set orderes=c.getOrderes(); // Iterator<Order> it=orderes.iterator(); // while(it.hasNext()){ // Order o=it.next(); // System.out.println(o.getId()+" "+o.getOrderNumber()); // // } // } /********************************************************************************************************/ //知识点11: 左外连接 //left outer join 左外连接,使用左外连接查询时, //将根据映射文件的配置来决定orders集合的检索策略 //返回是对象数组,对象数组的长度是2,对象数组中放置的是customer和order对象 // Query query=session.createQuery("from Customer c left outer join c.orderes where c.name like ?"); // query.setString(0, "%tom%"); // List list=query.list(); // for(int i=0;i<list.size();i++){ // Object[] pair=(Object[])list.get(i); // Customer c=(Customer)pair[0]; // Order o=(Order)pair[1]; // System.out.println(c.getId()+" "+c.getName()+"* "+o.getId()+" "+o.getOrderNumber()); // } /********************************************************************************************************/ //知识点12: 内连接 // Query query=session.createQuery("from Customer c join c.orderes where c.name like ?"); // query.setString(0, "%tom%"); // List list=query.list(); /********************************************************************************************************/ //知识点13: 迫切内连接 // Query query=session.createQuery("from Customer c inner join fetch c.orderes where c.name like ?"); // query.setString(0, "%tom%"); // List list=query.list(); /********************************************************************************************************/ //知识点15: 右连接 // Query query=session.createQuery("from Customer c right outer join c.orderes where c.name like ?"); // query.setString(0, "%tom%"); // List list=query.list(); /********************************************************************************************************/ //知识点17:投影查询(查询实体的部分属性),返回值是一个对象数组,数组中存放的查询的属性值s // Query query=session.createQuery("select c.name, o.orderNumber,o.price from Customer c inner join c.orderes o where c.name like ?"); // query.setString(0, "%tom%"); // List list=query.list(); /********************************************************************************************************/ //使用构造函数封装查询的信息 // Query query=session.createQuery("select new cn.itcast.search.CustomerRow(c.name, o.orderNumber,o.price) from Customer c inner join c.orderes o where c.name like ?"); // query.setString(0, "%tom%"); // List list=query.list(); /********************************************************************************************************/ // 知识点18:报表查询 查询有多少客户 // Query query=session.createQuery("select count(o) from Customer o"); // Long count=(Long)query.uniqueResult(); //知识点18:报表查询 分组 Query query=session.createQuery("select o.name,count(*) from Customer o group by o.name"); query.list(); /********************************************************************************************************/ tx.commit(); session.close(); } }