Hibernate的检索方式(四) -

转自:http://aumy2008.blogbus.com/logs/14005572.html

 

四、 报表查询

1、投影查询

       select c from Customer c ……

       select c.name,c.age from Customer c ……

1)动态实例化查询结果

       select new com.CustomerRow(c.id,c.name,c.age) from Customer c ……

       注:CustomerRow类不需要是持久化类,因此不必创建它的对象-关系映射文件,它紧紧用于把select语句查询出来的关系数据包装为Java对象。

2)过滤查询结果中的重复元素

       select distinct c.name Customer c ……

 

2、使用聚集函数

       HQL查询语句中可以调用以下聚集函数

l         count():统计记录数

l         min()

l         max()

l         sum()

l         avg():求平均值

 

3、分组查询(group by…(having…)

       select c.name,count(c) from Customer c group by c.name

       list()结果:n个对象数组类型的元素,每个对象数组对应查询结果中的一条记录。如

    Iterator it = session.createQurey(           "select c.name,count(c) from Customer c group by c.name")           .list().iterator();    while (it.hasNext()) {       Object[] pair = (Object[]) it.next();       String name = (String) pair[0];       Integer count = (Integer) pair[1];

    }

 

4、优化报表查询的性能

       报表查询的特点:通常会处理大量数据;一般只涉及对数据的读操作,而不会修改数据。

       select语句仅仅选择查询持久化类的部分属性时,Hibernate返回的查询结果为关系数据(不会占用Session的缓存),而不是持久化对象(位于Session缓存中)。

 

       如果采用select语句查询,能提高报表查询的性能,只要应用程序不在引用这些数据,它们占用的内存就会被释放。当采用from类型的HQL语句查询出持久化对象,会导致大量的持久化对象一直位于Session的缓存中,而且Session还比讯负责这些对象与数据库的同步。

 

       对于select语句查询,可以定义一个JavaBean来包装查询结果中的关系数据,使应用程序仍旧能够面向对象的方式来访问查询结果。

  

五、高级查询技巧

1、动态查询

       HQLQBC都能完成许多相同的任务,相比之下,HQL能够直观地表达复杂的查询语句,而QBC表达复杂的查询语句很麻烦。

       如果在程序运行前就明确了查询语句的内容(也称静态查询),应该优先考虑HQL查询方式。但是,如果只有在程序运行时才能明确查询语句的内容(也称动态查询),QBCHQL更加的方便。

 

QBE的模糊匹配示例:

    Customer customer=....    Example exampleCustomer=Example.create(customer);    exampleCustomer.ignoreCase().enableLike(MatchMode.ANYWHERE);    exampleCustomer.excludeZeroes();    Criteria criteria=session.createCriteria(Customer.class).add(exampleCustomer);

    List list=criteria.list();

注释:ignoreCase表示比较字符串时忽略大小写;enableLike表示样板对象中所有字符串类型的属性采用模糊比较;excludeZeroes表示样板对象中数字类型的属性为0,就不把它添加到查询语句中。如果某个属性为null,则查询语句不包含此条件。

       查询窗口中允许同时指定客户查询条件和订单查询条件,仍然可以使用QBE检索。

    Customer customer=....    Example exampleCustomer=Example.create(customer);    exampleCustomer.ignoreCase().enableLike(MatchMode.ANYWHERE);    exampleCustomer.excludeZeroes();    Order order=...    Example exampleOrder=Example.create(order);    exampleOrder.ignoreCase().enableLike(MatchMode.ANYWHERE);    exampleOrder.excludeZeroes();    Criteria criteria=session.createCriteria(Customer.class)       .add(exampleCustomer)       .createCriteria("orders")       .add(exampleOrder);

    List list=criteria.list();

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值