Hibernate查询方式的使用场合

今天读了一篇不错的文章,主要比较了Hibernate中几种查询方式的适用场合。通过实际的代码示例,得出了一个简单的结论,就是Criteria非常使用页面级的动态查询;HQL适合于固定的有业务含义的查询,并且最好使用hibernate的静态查询约定,写到映射文件中去。

以前我不喜欢使用这种静态查询,因为我改一个查询语句还要打开映射文件,不能直接在代码(DAO)中修改。不过随着项目规模的扩大,查询语句在代码中非常分散,难以做到集中管理或者审查,才发现使用静态查询的好处。因为所有查询语句是在影射文件中(xml),因此可以使用一些文件处理工具生成目前所有的HQL。

最后我的观点是,在表现层统一使用Criteria;DAO层统一使用静态查询。当然也是尽量。大家如果有什么看法请给我留言,欢迎讨论!


参考链接:http://www.javalobby.org/articles/hibernatequery102/


2012-01-31 补充:


继续前面的结论。昨天和涛-哥讨论了一下,是否在Action里直接使用Criteria的问题,获益匪浅。


首先,我原来的观点是,由用户动态定义条件的查询(下文简称动态查询。比如用户输入车辆牌照,查询车辆信息),应该放在Action中处理,生成查询语句(使用Criteria还是HQL只是形式问题)。我的理由是:

扫描二维码关注公众号,回复: 744151 查看本文章

1.这样最简单,好修改;

2. 动态查询一般限定于特定的页面(即处理也限定于特定的action),不会存在复用等问题;

实现方式如下图:

		DetachedCriteria criteria = DetachedCriteria.forClass(CYDO.class);
		if (StringUtils.isNotEmpty(lineCode)) {
			criteria.add(Restrictions.eq("lineCode", this.lineCode));
		}
		if (StringUtils.isNotEmpty(this.id)) {
			criteria.add(Restrictions.idEq(this.id));
		}
		criteria.add(Restrictions.eq("status", CYDO.STATUS_UN_DISPATCH));
		return cyDOService.dynamicQuery(criteria,
				this.newPaginationCriterion(), this.newOrderByCriterion());
 


但是讨论后,确实发现存在不少问题:

1. 在表现层引入了Hibernate的依赖(如果采用Criteria);

2. 表现层出现了查询逻辑。即表现层程序员还要了解系统结构,知道如何才能查询出结果;

3. 查询逻辑的分散。替换DAO并不能保证所有数据库操作被替换。从而使得DAO模式丧失了意义。


最后的结论是:所有查询都应该在DAO中定义。即使这样会导致很多查询方法的定义。

比如一个页面需要根据车辆牌照查询车辆,另一个页面需要根据司机查询车辆。那么我们需要两个DAO查询接口。这样,Action代码中只有调用相关查询接口的操作,不会存在查询语句的生成和拼装。

猜你喜欢

转载自power1128.iteye.com/blog/1387730