现在的位置: 首页 > 综合 > 正文

Hibernate的检索方式(四)

2013年08月22日 ⁄ 综合 ⁄ 共 2396字 ⁄ 字号 评论关闭

Hibernate的检索方式(四) - [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

、动态查询

      
HQL



QBC

都能完成许多相同的任务,相比之下,
HQL

能够直观地表达复杂的查询语句,而
QBC

表达复杂的查询语句很麻烦。

      


如果在程序运行前就明确了查询语句的内容(也称静态查询),应该优先考虑
HQL

查询方式。但是,如果只有在程序运行时才能明确查询语句的内容(也称动态查询),
QBC


HQL

更加的方便。

 

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();

 

待续。。。

抱歉!评论已关闭.