开发者社区> 问答> 正文

使用hibernate的criteria时,应该封装在哪一层?怎么封装

最近在学习SSH整合,发现hibernate有一个面向对象的查询类:criteria,觉得挺有意思,就上网查查资料。发现有些例子在使用criteria的时候,都把它放在dao方法参数里,比如 queryUsers(Criteria(或DetachedCriteria) criteria),然后findByCriteria,dao由service层去调用,criteria的创建,参数、条件等的封装都放在了service层。这样service不就依赖于dao(hibernate)了?耦合在一起了。后来又发现,如果criteria的封装放在dao层,前台获取参数后,把参数封装编程map或数组或list,然后传到Dao,再一个个遍历拼接到criteria,也比较麻烦,不知道大家在使用criteria的时候,是怎样去设计的,又没什么简单好用的技巧,分享一下学习学习~

展开
收起
a123456678 2016-03-18 14:33:31 2590 0
1 条回答
写回答
取消 提交回答
  • 我觉得应该封装在dao层,不然怎么获取session?

    demo如下:

    public class BaseDaoImpl<E> implements BaseDao<E> {
     
        private Logger log = Logger.getLogger(this.getClass());
     
        @PersistenceContext
        private EntityManager entityManager;
     
        protected Class<?> entityClass;
     
        public BaseDaoImpl(Class<E> entityClass) {
            this.entityClass = Reflections.getClassGenricType(getClass());
        }
     
        /**
         * 获取实体工厂管理对象
         */
        public EntityManager getEntityManager() {
            return entityManager;
        }
     
        /**
         * 获取 Session
         */
        public Session getSession() {
            return (Session) getEntityManager().getDelegate();
        }
     
        /**
         * 使用检索标准对象分页查询
         *
         * @param page
         * @param detachedCriteria
         * @param resultTransformer
         * @return
         */
        @SuppressWarnings("unchecked")
        public Page<E> find(Page<E> page, DetachedCriteria detachedCriteria, ResultTransformer resultTransformer) {
            // get count
            page.setTotalCount(count(detachedCriteria));
            if (page.getTotalCount() < 1) {
                return page;
            }
     
            Criteria criteria = detachedCriteria.getExecutableCriteria(getSession());
            criteria.setResultTransformer(resultTransformer);
            // set page
            // 分页
            if (page.getPageNo() > 0 && page.getPageSize() > 0) {
                criteria.setFirstResult(page.getFirst() - 1);
                criteria.setMaxResults(page.getPageSize());
            }
     
            page.setResult(criteria.list());
            return page;
        }
     
         
     
        /**
         * 使用检索标准对象查询
         *
         * @param detachedCriteria
         * @param resultTransformer
         * @return
         */
        @SuppressWarnings("unchecked")
        public List<E> find(DetachedCriteria detachedCriteria, ResultTransformer resultTransformer) {
            Criteria criteria = detachedCriteria.getExecutableCriteria(getSession());
            criteria.setResultTransformer(resultTransformer);
            return criteria.list();
        }
     
        
     
        /**
         * 创建与会话无关的检索标准对象
         *
         * @param criterions Restrictions.eq("name", value);
         * @return
         */
        public DetachedCriteria createDetachedCriteria(Criterion... criterions) {
            DetachedCriteria dc = DetachedCriteria.forClass(entityClass);
            for (Criterion c : criterions) {
                dc.add(c);
            }
            return dc;
        }
     
        /**
    }
    
    
    所有的daoImpl都继承这个BaseDaoImpl
    
    然后调用的时候在service层直接调用,demo如下:
    
    DetachedCriteria dc = baseDao.createDetachedCriteria();
     
            dc.add(Restrictions.like("name", "%" + name + "%"));
            dc.addOrder(Order.asc("id"));
            //page= baseDao.find(page, dc);
            list = baseDao.find(dc)
    2019-07-17 19:06:40
    赞同 展开评论 打赏
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载