照你说的复杂SQL 一般ACTION传关键性的参数给SERVICE
再由SERVICE组成最终语句 最后调用DAO的LIST FIND(String hql)方法获得LIST

解决方案 »

  1.   

    ACTION的关键性参数是指由WEB提交或传来的参数
      

  2.   

    这样跟你说吧,dao里面就是一些基本的数据操作 增加、删除等
    service里面则是引用了dao扩展,比如要查询某个具体的表调用DAO传入对象即可,如果需要其他查询,在service里面写入HQL
    action里面则是调用service的,方法已经由service实现,不需要与hibernate挂钩了
    我在dao 中写了个方法通过传detachedCriteria对象来查询。这样的话我可以在action里写出查询语句了。也比较灵活。
    你中间遗忘了service,它可以组成具体的action里面你想要的方法供action调用
      

  3.   

    action 一般我就是让他控制跳转画面,dao 一般我就让他查询数据不做业务处理直接从service里面传过来HQL
    查询数据,我习惯吧业务处理都放到service层 当然我不敢说很合理不过我感觉这个应该可以接受。
      

  4.   

    我并没有忘service.可能是我自己没有表述清楚。我的service就是调用dao,或是组合使用dao的方法。我在dao 中写了个方法通过传detachedCriteria对象来查询。主要是在action里构造查询条件方便,也很灵活。我也想过通过传入一些参数,最总在dao中够着hql查询,可是比如说包含日期之类条件的查询做成通用的就很难。
    冒失我提了好几个问题。1:dao是否只要有一个daoInterface 和daoImpl就可以了。(用范型做成通用的)
    2:在service层如果我需要操作多个dao的时候,怎么做事务。(dao有接口回调可以处理事务)!!!!!
    3:就是那个复杂查询的问题。我想的是通过传入参数给service-dao,然后在dao中动态生成hql.可是诸如日期介于。。之间这些条件就蛮难构造。如果只是==或是like之类的动态生成我是会的。
      

  5.   

    通常事務是坐在service層,所以事務也會在這層來處理,servece層可以有多個dao接口且配置聲明的事務處理,如下@Component
    public class PaApplyAuditManagerImp implements PaApplyAuditManager {
    private ParameterDao parameterDao;

    private PaApplyAuditDao paApplyAuditDao;

    private PaProjectApplyDao paProjectApplyDao;

    @Autowired
    public void setParameterDao(ParameterDao parameterDao){
    this.parameterDao=parameterDao;
    }

    @Autowired
    public void setPaProjectApplyDao(PaProjectApplyDao paProjectApplyDao) {
    this.paProjectApplyDao = paProjectApplyDao;
    }

    @Autowired
    public void setPaApplyAuditDao(PaApplyAuditDao paApplyAuditDao) {
    this.paApplyAuditDao = paApplyAuditDao;
    }        @Transactional
    public PaApplyAuditBO query(LoginUserBO loginUser,
    PaApplyAuditQC PaApplyAuditQC) throws ApplicationException {//qc對象估計類似于你的 detachedCriteria PaApplyAuditBO bo = this.paApplyAuditDao.query(loginUser, PaApplyAuditQC);

    if(bo!=null){
    this.paApplyAuditDao.initialize(bo.getPaAttachmentAuditDetail());
    this.paApplyAuditDao.initialize(bo.getPaExpenseDetail());
    }

    return bo;
    }
            @Transactional
    public void update(LoginUserBO loginUser, PaApplyAuditBO paApplyAuditBO)
    throws ApplicationException {
               PaApplyAuditBO bo = this.paApplyAuditDao.get(loginUser, paApplyAuditBO.getUid());
               if(bo.getModificationNum()!=null)bo.setModificationNum(bo.getModificationNum()+1);
               ....略
               this.paApplyAuditDao.update(loginUser, bo);
            }
    dao:@Repository
    public class PaProjectApplyDaoImp extends GenericHibernateDao<PaProjectApplyBO, String> implements PaProjectApplyDao { public Integer count(PaProjectApplyQC PaProjectApplyQC) throws PersistenceException {
    QueryObject queryObject = getQueryObject(PaProjectApplyQC);
    return this.count(queryObject);
    } public List<PaProjectApplyBO> search(PaProjectApplyQC PaProjectApplyQC) throws PersistenceException {
    QueryObject queryObject = getQueryObject(PaProjectApplyQC);
    queryObject.setRang(PaProjectApplyQC.getHeadIndex(), PaProjectApplyQC.getMaxCount());
    queryObject.addSort(PaProjectApplyQC.getSort());
    return this.search(queryObject);
    } private QueryObject getQueryObject(PaProjectApplyQC PaProjectApplyQC) throws PersistenceException{
    QueryObject queryObject = new QueryObject(PaProjectApplyBO.class);


    //启用标志
    if(!StringUtils.isEmpty(PaProjectApplyQC.getUsingFlag())){
    queryObject.addCriterion(new Criterion(PaProjectApplyDao.USINGFLAG, Criterion.EQUAL_TO, PaProjectApplyQC.getUsingFlag()));
    }
    //审核状态(取得审核状态>=14的表示已经提交审核的数据)
    if(!StringUtils.isEmpty(PaProjectApplyQC.getAuditFlag())){
    queryObject.addCriterion(new Criterion(PaProjectApplyDao.AUDITFLAG, Criterion.GREATER_EQUAL, PaProjectApplyQC.getAuditFlag()));
    }
    return queryObject;
    }
    sping的事務
    <context:component-scan base-package="com.nes.platform.service.managerimp"/>
      

  6.   

    事物托管给spring的话,lz可以看看OpenSessionInViewFilter