锁定老帖子 主题:service于dao的界限
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2005-07-26
主要问题是出在分页上面!请大家看我的做发。 下面是本人的一个CommonListDAOImp.java public class CommonListDAOImp extends HibernateDaoSupport implements CommonListDAO { // Log private static final Log log = LogFactory.getLog(CommonListDAOImp.class);; private int maxPages; private int totalNum; private int pageSize; private List currentPageList; /* * (non-Javadoc); * * @see com.denis.testproject.dao.imp.CommonListDAO#initialListDAO(java.lang.String, * int, int); */ public void initialListDAO(String hql, int pageNo, int pageSize); { log.info("$$ initialListDAO(); is runing ....");; Query query = null; query = this.getSession();.createQuery(hql);; int start = (pageNo - 1); * pageSize; int rowNum = pageSize; query.setFirstResult(start);; query.setMaxResults(rowNum);; this.totalNum = query.list();.size();; this.pageSize = pageSize; this.maxPages = totalNum / pageSize; if (totalNum % pageSize != 0); { this.maxPages++; } this.currentPageList = query.list();; } /* * (non-Javadoc); * * @see com.denis.testproject.dao.imp.CommonListDAO#getCurrentPageList(); */ public List getCurrentPageList(); { return currentPageList; } /* * (non-Javadoc); * * @see com.denis.testproject.dao.imp.CommonListDAO#getMaxPages(); */ public int getMaxPages(); { return maxPages; } /* * (non-Javadoc); * * @see com.denis.testproject.dao.imp.CommonListDAO#getPageSize(); */ public int getPageSize(); { return pageSize; } /* * (non-Javadoc); * * @see com.denis.testproject.dao.imp.CommonListDAO#getTotalNum(); */ public int getTotalNum(); { return totalNum; } } 下面是我service里面的一个对应的方法 public Map getMainTipsByPages(Map inputParam);{ Map result = new HashMap();; PaginationVO paginationVO = (PaginationVO); inputParam.get("paginationVO");; String hql = "select mainTip from MainTips as mainTip order by mainTip.postTime"; int pageNo = paginationVO.getCurrentPageNo();; int pageSize = paginationVO.getPageSize();; commonListDAO.initialListDAO(hql,pageNo,pageSize);; paginationVO.setCurrentPageList(commonListDAO.getCurrentPageList(););; paginationVO.setMaxPage(commonListDAO.getMaxPages(););; paginationVO.setTotalRecord(commonListDAO.getTotalNum(););; result.put("paginationVO",paginationVO);; return result; } commonListDAO 是用spring注入进去的! 上面就是我的dao和service的设计,但是我这样做的话就一定会在service层里面出现hql代码了!哪位兄弟给点好的建议!非常感谢。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2005-07-26
service只提供参数,hql的钩造工作交给DAO.
|
|
返回顶楼 | |
发表时间:2005-07-26
能不能对这个分页提供一个好的解决方法呢!
|
|
返回顶楼 | |
发表时间:2005-07-27
你可以这样封装:
public class SearchCriteria{ static int PageSize; int totalRowNum; int currentPageNum; List params; List orderBys; } public Class Pager{ List result; int totalRowNum; } SearchCriteria 用来保存从前台传过来的分页,参数,分页等信息,在service layer进行过滤,增加查询参数等。然后把SearchCriteria传给DAO,DAO返回Pager对象,包括分页后的结果等信息。然后给前台处理。 在Service层中不要对分页信息处理。 |
|
返回顶楼 | |
发表时间:2005-07-27
阿木欢 写道 你可以这样封装:
public class SearchCriteria{ static int PageSize; int totalRowNum; int currentPageNum; List params; List orderBys; } public Class Pager{ List result; int totalRowNum; } SearchCriteria 用来保存从前台传过来的分页,参数,分页等信息,在service layer进行过滤,增加查询参数等。然后把SearchCriteria传给DAO,DAO返回Pager对象,包括分页后的结果等信息。然后给前台处理。 在Service层中不要对分页信息处理。 不知阿木欢兄所说的List params;这个里面放的是什么是一个完整的查询语句还是要查询的column,在service层的过滤和增加查询参数是指把前面的参数拼凑成一个sql语句或hql等查询语句吗?然后再传给dao处理?谢谢你的关注! |
|
返回顶楼 | |
发表时间:2005-07-27
为什么不试试论坛的查找功能:
http://forum.iteye.com/viewtopic.php?t=14657 |
|
返回顶楼 | |
发表时间:2005-07-27
1. Dao base class:
public class BaseDao extends HibernateDaoSupport implements IDao { ...... public BaseDao(){} protected HibernateTemplate createHibernateTemplate (SessionFactory sessionFactory) { return new IssHibernateTemplate(sessionFactory); } public final IssHibernateTemplate getIssHibernateTemplate() { return (IssHibernateTemplate)getHibernateTemplate(); } ...... public List queryAllEntities(int start, int range) throws DaoException { return getIssHibernateTemplate().loadAll(m_entityType, start, range); } ....... } 2. then in extended dao classes, do like following: ...... public List queryAll(int start, int range, int orderBy, boolean ascend ) throws DaoException{ String sql_s = ...... return getIssHibernateTemplate().find( sql_s, start, range ); } ...... |
|
返回顶楼 | |
发表时间:2005-07-28
我做的和阿木欢的差不多,不过我只设置了Pager这个对象,而SearchCriteria我去掉了,而是直接把在Service中用
dao.listPagination(int start,int num,List params),具体hql的构造在dao中来做,params只是一个“参数-值”的列表。 当然,你用Map,或者自己定义一个类都可以,如果查询参数比较固定的话,我一般是喜欢定义一个专门的javabean,里面就是各个参数的列表。 |
|
返回顶楼 | |
发表时间:2005-07-28
lingcm 写道 阿木欢 写道 你可以这样封装:
public class SearchCriteria{ static int PageSize; int totalRowNum; int currentPageNum; List params; List orderBys; } public Class Pager{ List result; int totalRowNum; } SearchCriteria 用来保存从前台传过来的分页,参数,分页等信息,在service layer进行过滤,增加查询参数等。然后把SearchCriteria传给DAO,DAO返回Pager对象,包括分页后的结果等信息。然后给前台处理。 在Service层中不要对分页信息处理。 不知阿木欢兄所说的List params;这个里面放的是什么是一个完整的查询语句还是要查询的column,在service层的过滤和增加查询参数是指把前面的参数拼凑成一个sql语句或hql等查询语句吗?然后再传给dao处理?谢谢你的关注! 这个List params指的是前台用户input的参数的值,至于column不应该让前台知道,应该在service layer对参数过滤。还有一种办法,就是结合MVC模式中的model,让前台传到service的都是已经填充好参数的model,这样再传给DAO处理会方便一些。我说的过滤指的是,用户输入的参数有时候并不能代表就是dao层需要的阐述,你可能需要在service层中进行searchCriteria的组织工作,比如:用户在界面上选择了升序排序,那你就必须在service层里面把用户的input转换成DAO能够识别的方式:searchCriteria.addOrderBy("desc");至于组装sql或者hql的工作其实是有共性的,你可以创建一个SQL/HQLRendering类,专门负责把searchCriteria translate成你需要的sql/hql clause。然后在需要的dao中调用Rendering类翻译。 |
|
返回顶楼 | |
发表时间:2005-07-28
giginet 写道 我做的和阿木欢的差不多,不过我只设置了Pager这个对象,而SearchCriteria我去掉了,而是直接把在Service中用
dao.listPagination(int start,int num,List params),具体hql的构造在dao中来做,params只是一个“参数-值”的列表。 当然,你用Map,或者自己定义一个类都可以,如果查询参数比较固定的话,我一般是喜欢定义一个专门的javabean,里面就是各个参数的列表。 这个searchCriteria其实是和我设计的一个hqlRendering类配合使用的,我用这个hqlRendering类把servicelayer组织的searchCriteria翻译成hql,这样很多dao的功能比如dynamic search就可以写成一个放在BasicDAO里面的通用方法,减少代码量。 |
|
返回顶楼 | |