HQL经典语句

HQL经典语句 
 
Hib的检索方式
1'导航对象图检索方式。通过已经加载的对象,调用.iterator()方法可以得到order对象
如果是首次执行此方法,Hib会从数据库加载关联的order对象,否则就从缓存中得到。
2'OID检索方式。通过session的get,load方法知道了OID的情况下可以使用
3'HQL检索方式。使用面向对象的HQL查询语句session的find方法利用HQL来查询
4'QBC检索方式。利用QBCAPI来检索它是封装了基于字符串的查询语句
5'本地的SQL检索方式。使用本地数据库的SQL查询语句Hib会负责把检索到的JDBC结果集映射为持久化对象图。

五种检索方式的使用场合和特点:

HQL : 是面向对象的查询语言,同SQL有些相似是Hib中最常用的方式。
       查询设定各种查询条件。
       支持投影查询,检索出对象的部分属性。
       支持分页查询,允许使用having和group by
       提供内制的聚集函数,sum(),min(),max()
       能调用用户的自定义SQL
       支持子查询,嵌入式查询
       支持动态绑定参数
建议使用Query接口替换session的find方法。
   Query Q = session.createQuery("from customer as c where c.name = :customerName" + "and c.age = :customerAge");
   query.setString ("customerName" , "tom");
   query.setInteger("customerAge" , "21");
   list result = query.list();
QBC :  QBCAPI提供了另一种方式,主要是Criteria接口、Criterion接口和Expression类
   Criteria criteria = session.createCriteria(customer.class);
   Criterion criterion1 = Expression.like("name","t%");
   Criterion criterion2 = Expression.eq("age",new Integer(21));
   Critera = criteria.add(criterion1) ;
   Critera = criteria.add(criterion2) ;
   list result = criteria.list();
   或是: list result = session.createCriteria(Customer.class).add(Expression.eq("this.name","tom")).list();
SQL :  采用HQL和QBC检索时,Hib生成SQL语句适用所有数据库。
   Query query  = session.createSQLQuery("select {c.*} from customers c where c.name like : customername " + "and c.age = :customerage","c",customer.calss);
   query.setString("customername","tom");
   query.setInteger("customerage","21");
   list result = query.list();
/多态查询
   HQL :session.createQuery("from employee");
   QBC :session.createCriteria(employee.class);
   HQL : session.createQuery("from hourlyEmployee");
   QBC : session.createCriteria(hourlyEmployee.class);
   下面的HQL查询语句将检索出所有的持久化对象:
   from java.lang.Object ;
   from java.io.serializable ;
查询的排序
   1'查询结果按照客户姓名升序排列:
   HQL :
        Query query = session.createQuery ("from customer c order by c.name");
   QBC :
        Criteria criteria = session.createCriteria(customer.class);
        criteria.addOrder(order.asc("name"));
   HQL :
        Query query = session.createQuery ("from customer c order by c.name asc , c.age desc");
   QBC :
        Criteria criteria = session.createCriteria(customer.class);
        criteria.addOrder(order.asc ("name"));
        criteria.addOrder(order.desc("age"));

        import net.sf.hibernate.pression.Order
        import mypack.Order
        ...........
        Criteria criteria = session.createCritria (mypack.Order.class);
        criteria.addOrder(net.sf.hibernate.Order.asc("name"));
///HQL语句的参数绑定Query接口提供了绑定各种Hib映射类型的方法。
        setBinary()
        setString()
        setBoolean()
        setByte()
        setCalendar()
        setCharacter()
        setDate()
        setDouble()
        setText()
        setTime()
        setTimestamp()
        setEntity()//把参数与一个持久化类的事例绑定lsit result = session.createQuery("from order o where o.customer =            :customer").setEntity("customer" , customer).list ;
        setParameter()//绑定任意类型的参数
        setProperties()//把命名参数与一个对象的属性值绑定 Query query = session.createQuery("from customer c where c.name =:     name " + "and c.age =:age" );
        Query.setProperties(customer); 

过滤查询结果中的重复元素
     使用Set集合来去除重复元素;或是使用distinct元素
     Iterator iterator = session.createQuery("select distinct c.name from customer ").list().iterator();
     while(iterator.hasnext()){
           String name = (String) it.next() ;
     }
///使用聚集函数
count(); 记录的条数
min();   求最小值
max();   求最大值
avg();   求平均值
sum();   求和
1'查询customer中的所有记录条数
   integer i = (Integer) session.createQuery("select count(*) from customer").uniqueResult();
2'查询customer中的所有客户的平均年龄
   integer i = (Integer) session.createQuery("select avg(c.age) from customer c ").uniqueResult();
3'查询customer中的客户年龄的最大值、最小值
   object [] i = (Integer) session.createQuery("select max(c.age),min(c.age) from customer c ").uniqueResult();
   Integer Maxage = (Integer) i [0];
   Integer Minage = (Integer) i [1];
4'统计customer中的客户的名称数目,忽略重复的姓名
   Integer cout = (Integer) session.createQuery("select count(distinct c.name) from customer c").uniqueResult();
使用分组查询
1'按姓名分组,统计customer中的相同姓名的记录数目
   Iterator iterator = (Integer) session.createQuery("select c.name ,count(c) from customer c group by c.name").list.iterator();
   while(iterator.hasnext()){
         object[] p = (objcet[])iterator.next();
         String name = p[0];
         Integer cout = p[1];
   }
2'按客户分组,统计每个客户的订单数量
   Iterator iterator = session.crateQuery("select c.id ,c.name , count(o) from customer c join c.order o group by c.id ").list().iterator;
   while(iterator.hasnext()){
         object[] p = (objcet[])iterator.next();
         Integer id = p[0]
         String name = p[1];
         Integer cout = p[2];
   }
3'统计每个客户的订单总价
   Iterator iterator = session.crateQuery("select c.id ,c.name,sum(o.price) from customer c join c.order o group by c.id").list.iterator();
   while(iterator.hasnext()){
         object[] p = (objcet[])iterator.next();
         Integer id = p[0]
         String name = p[1];
         Double cout = p[2];
   }
//报表的优化
使用HQL时如果只查询对象的一部分属性不会返回持久化对象
from customer c join c.order o group by c.age;//返回持久化对象,占用缓存。

select c.id , c.name , c.age ,o.id ,o.price from customer c join c.order o group by c.age //返回关系性数据,不占用session的缓存,可以为JVM回收

/HQL子查询的集合函数属性
size() 返回集合中元素的数目
minIndex() 建立索引的集合获得最小的索引
maxIndex() 建立索引的集合获得最大的索引
minElement() 对于包含基本元素的集合获得集合最小的元素
maxElement() 对于包含基本元素的集合获得集合最大的元素
element() 获得集合中的所有元素
///Hibernate的缓存管理
管理一级缓存,不建议使用下列方法来管理一级缓存
evict(Object o)从缓存中清除参数指定的持久化对象
clear()清空缓存中所有的持久化对象
///批量更新和批量删除
批量更新customer表中的年龄大于零的所有记录的AGE字段:
    tx = session.beginTransaction();
    Iterator customer = session.find("from customer c where c.age > 0").iterator();
    while(iterator.hasnext()){
        customer customer = (customer) customer.next();
        customer.setAge(customer.getAge()+1);
    }
    tx.commit();
    session.close();//上述代码对数据库操作效果不好可以使用下列的JDBCAPI直连
  
    tx = session.beginTranscation();
    Connection conn = session.connection();
    Preparedstatement ps = conn.preparedstatment("update customer set age = age + 1 where age > 0 ");
    ps.executeupdate();
    tx.commit();
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HQL(Hibernate Query Language)是 Hibernate 框架中用于查询数据库的一种语言,它类似于 SQL,但更加面向对象。 HQL 语句的执行过程如下: 1. 创建 SessionFactory 首先,需要创建一个 SessionFactory 对象。SessionFactory 是 Hibernate 中的一个重要概念,它负责创建 Session 对象,代表着与数据库的一次会话。 2. 创建 Session 使用 SessionFactory 创建一个 Session 对象。Session 是 Hibernate 中的核心对象,用于执行数据库操作。 3. 开启事务 使用 Session 开启一个事务。Hibernate 中的每个数据库操作都应该在一个事务中执行,以保证数据的完整性和一致性。 4. 创建 Query 对象 使用 Session 创建一个 Query 对象,它表示一个 HQL 查询语句。 5. 设置查询参数 如果 HQL 查询语句包含参数,需要使用 Query 对象的 setParameter 方法来设置参数的值。 6. 执行查询 调用 Query 对象的 list 或 uniqueResult 方法执行查询。list 方法返回一个 List 对象,包含了查询结果的所有对象;uniqueResult 方法返回一个单一对象,如果查询结果为空或多于一个,则抛出异常。 7. 提交事务 如果查询操作不需要修改数据库中的数据,则直接提交事务。如果需要修改数据库中的数据,则需要在事务中执行相应的操作,然后再提交事务。 8. 关闭 Session 最后,关闭 Session 对象,释放资源。 需要注意的是,HQL 语句的执行过程会涉及到多个层面的性能优化,包括缓存、延迟加载、批量操作等。这些优化策略可以提高查询效率,减少数据库的访问次数,从而提升应用程序的性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值