0 0

findByCriteria(...)应该怎么用?3

findByCriteria(...)应该怎么用?

public List<T> findByCriteria(Criterion... criterion) {
        return createCriteria(criterion).list();
    }

这个方法应该怎么用?

比如表结构如下
id pk
money float
type_id fk

按照type_id分组求sum(money) 在dao里应该怎么写?
2008年10月21日 15:40

2个答案 按时间排序 按投票排序

0 0

采纳的答案

首先这是Hibernate的QBC检索方式,建议baidu下QBC,或者看书和API。
下面是我写过的一个项目中的代码片段,这是DAO的片段

public List<DispatchTask> findByCriteria(DetachedCriteria criteria) {
    	log.debug("finding DispatchTask instance by criteria");
        try {
            List<DispatchTask> results = getHibernateTemplate().findByCriteria(criteria);
            log.debug("find by criteria successful, result size: " + results.size());
            return results;
        } catch (RuntimeException re) {
            log.error("find by criteria failed", re);
            throw re;
        }
    }

这是Service的片段
public List<DispatchTask> getByQuery(DispatchTask instance,
			Date queryTime1, Date queryTime2) {
		String taskId = instance.getTaskId();
		String deptName = instance.getDeptName();
		String linkman = instance.getLinkman();
		String plateNum = instance.getPlateNum();
		Short statusId = instance.getStatusId();
		Date queryTime3 = null;
		if(queryTime2 != null){
			queryTime3 = new Date();
			queryTime3.setTime(queryTime2.getTime()+(new Long("86400000")));
		}
		
		DetachedCriteria criteria = DetachedCriteria
				.forClass(DispatchTask.class);
		if (taskId != null && taskId != "") {
			criteria.add(Expression.like("taskId", taskId, MatchMode.ANYWHERE));
		}
		if (deptName != null && deptName != "") {
			criteria.add(Expression.like("deptName", deptName,
					MatchMode.ANYWHERE));
		}
		if (linkman != null && linkman != "") {
			criteria.add(Expression
					.like("linkman", linkman, MatchMode.ANYWHERE));
		}
		if (plateNum != null && plateNum != "") {
			criteria.add(Expression.like("plateNum", plateNum,
					MatchMode.ANYWHERE));
		}
		if (statusId != null && statusId != 999) {
			criteria.add(Expression.eq("statusId", statusId));
		}
		if (queryTime1 != null) {
			if(queryTime2 != null){
				if(queryTime1.getTime() <= queryTime2.getTime()){
					criteria.add(Expression.between("dispatchDate", queryTime1,
							queryTime3));
				}
			}else{
				criteria.add(Expression.ge("dispatchDate", queryTime1));
			}
		}else{
			if(queryTime2 != null){
				criteria.add(Expression.le("dispatchDate", queryTime3));
			}
		}
		
		return dispatchTaskDAO.findByCriteria(criteria);
	}


关键是给出规则,即Criterion,DetachedCriteria是继承它的。这个找个Hibernate的API就了解了。
至于您说的例子,DAO就是DatabaseAccessObject,我觉得您把逻辑放进DAO里是不是违反了面向对象的思想呢?我不喜欢这么设计

2008年10月23日 23:35
0 0

看了一下,发现这个Service里的方法写的是够烂的,我来解释一下。
这个方式其实是一个多条件查询,用户不填写的话,代表忽略此条件。所以做了N次if判断

2008年10月23日 23:39

相关推荐

    Hibernate中Criteria的完整用法.docx

    ().findByCriteria(detachedCriteria) 方法可以很方便地根据DetachedCriteria 来返回查询结 果。 DetachedCriteria 提供了 2 个静态方法 forClass(Class) 或 forEntityName(Name) 进行DetachedCriteria 实例的创建。

    基于SpringJDBC的轻量级ORM框架sborm.zip

    1、hibernate:过于臃肿,使用不够灵活,优化难(其实主要是因为很少用),HQL感觉就是个渣,在 mysql几乎一统天下的背景下,跨数据库级别的兼容吃力不讨好。Hibernate的对象化关联处理确实挺强大,但是使用起来坑太...

    Hibernate中Criteria的完整用法

    Spring 的框架提供了 getHibernateTemplate().findByCriteria(detachedCriteria) 方法可以很方便地根据 DetachedCriteria 来返回查询结果。 Criteria 和 DetachedCriteria 均可使用 Criterion 和 Projection 设置...

    fiware-commons:FIWARE 项目的软件部署和配置以及 PaaS 管理器实现的公共库

    公共图书馆 - 概述 你得到什么 在 paasmanager、sdc 和 puppetwrapper 中使用的 Fiware 公共库 如何在这个库中使用 ... List&lt;Example&gt; findByCriteria(ExampleSearchCriteria criteria); } 如果您想使用基于 JPA 的实

    具备直接操作数据库的功能

    + (NSArray *)findByCriteria:(NSString *)criteria; /** * 创建表 * 如果已经创建,返回YES */ + (BOOL)createTable; #pragma mark - must be override method /** 如果子类中有一些property不需要创建数据库...

Global site tag (gtag.js) - Google Analytics