• Hibernate -- 检索方式 HQL


    Hibernate 提供了以下几种检索对象的方式

    导航对象图检索方式 根据已经加载的对象导航到其他对象

    OID 检索方式按照对象的OID 来检索对象

    HQL 检索方式:使用面向对象的HQL查询语言

    QBC 检索方式:使用QBC(Query By Criteria) API来检索对象.这种API 封装了基于字符串形式的查询语句,提供了更加面向对象的查询接口.

    本地 SQL 检索方式:使用本地数据库的SQL 查询语句

    HQL检索方式包括以下步骤:
    通过 SessioncreateQuery()方法创建一个Query 对象,它包括一个HQL 查询语句. HQL查询语句中可以包含命名参数
    动态绑定参数
    调用 Querylist() 方法执行查询语句.该方法返回java.util.List类型的查询结果,List 集合中存放了符合查询条件的持久化对象.
    Qurey 接口支持方法链编程风格,它的setXxx() 方法返回自身实例,而不是void 类型
    HQL vs SQL:
    HQL 查询语句是面向对象的, Hibernate负责解析HQL 查询语句,然后根据对象-关系映射文件中的映射信息,HQL 查询语句翻译成相应的SQL语句. HQL查询语句中的主体是域模型中的类及类的属性
    SQL 查询语句是与关系数据库绑定在一起的. SQL查询语句中的主体是数据库表及表的字段.
     
    绑定参数:
    Hibernate 的参数绑定机制依赖于 JDBC API 中的 PreparedStatement 的预定义 SQL 语句功能.
    HQL 的参数绑定由两种形式:
    按参数名字绑定:HQL 查询语句中定义命名参数,命名参数以 “:开头.
    按参数位置绑定:HQL 查询语句中用 “?”来定义参数位置
    相关方法:
    setEntity(): 把参数与一个持久化类绑定
    setParameter(): 绑定任意类型的参数. 该方法的第三个参数显式指定Hibernate映射类型
    HQL 采用 ORDER BY关键字对查询结果排序

    知识点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查询:默认检索的是成对的对象CustomerOrder返回是对象数组

    知识点13:   迫切内连接

    //Inner  join  fetch表示迫切内连接检索策略,也就是覆盖映射文件中指定的检索策略

    知识点15:   右连接

    HQL: right outer join  右外连接  返回是对象数组

    知识点17:投影查询

    查询结果仅包含实体的部分属性.通过 SELECT 关键字实现.
    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:报表查询

    报表查询用于对数据分组和统计, SQL 一样, HQL利用 GROUP BY关键字对数据分组,HAVING关键字对分组数据设定约束条件.
    HQL 查询语句中可以调用以下聚集函数count() min() max()sum() avg()

    使用聚集函数
    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();
    	}
    }


     


  • 相关阅读:
    mysql数据库之多表查询
    mysql数据库之单表查询
    mysql数据库之表和库
    mysql数据库之windows版本
    mysql数据库之linux版本
    mysql数据库之mysql下载与设置
    python基础之逻辑题(3)
    python基础之逻辑题(2)
    python基础之逻辑题(1)
    spring boot统一异常处理
  • 原文地址:https://www.cnblogs.com/xj626852095/p/3647999.html
Copyright © 2020-2023  润新知