最近在学习SSH整合,发现hibernate有一个面向对象的查询类:criteria,觉得挺有意思,就上网查查资料。发现有些例子在使用criteria的时候,都把它放在dao方法参数里,比如 queryUsers(Criteria(或DetachedCriteria) criteria),然后findByCriteria,dao由service层去调用,criteria的创建,参数、条件等的封装都放在了service层。这样service不就依赖于dao(hibernate)了?耦合在一起了。后来又发现,如果criteria的封装放在dao层,前台获取参数后,把参数封装编程map或数组或list,然后传到Dao,再一个个遍历拼接到criteria,也比较麻烦,不知道大家在使用criteria的时候,是怎样去设计的,又没什么简单好用的技巧,分享一下学习学习~
我觉得应该封装在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)
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。