今天看到有人写的hibernate 分页代码 public PaginationSupport findPageByCriteria( final DetachedCriteria detachedCriteria, final Order order, final int pageSize, final int startIndex) { return (PaginationSupport) getHibernateTemplate().execute( new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException { Criteria criteria = detachedCriteria.getExecutableCriteria(session); int totalCount = ((Integer) criteria.setProjection( Projections.rowCount()).uniqueResult()) .intValue(); criteria.addOrder(order); criteria.setProjection(null); List items = criteria.setFirstResult(startIndex) .setMaxResults(pageSize).list(); PaginationSupport ps = new PaginationSupport(items, totalCount, pageSize, startIndex); return ps; } }, true); } 这是我以前用hibernate2的时候写的 public List findByPage(CalPage page, String whereClause) { String queryString = "select t from " + this.clazz.getName() + " as t " + whereClause; //Log.log(queryString); List result = null; try { openSession(); Query q = session.createQuery(queryString); //由于实际取到的从下一位开始, 所以修正 q.setFirstResult(page.getStart() - 1); q.setMaxResults(page.getRecords()); result = q.list();看看那个高手写的 Criteria,我真想问一下高手,您头不晕吗? 何必呢 何苦呢 我不拿代码叠罗汉就不是 OO 了?
public List findByPage String queryString = "select t from " + this.clazz.getName() + " as t " + whereClause; --------------------------------- 如果我要查询另外的结果集,加入更多更复杂的条件,需要分页怎么办?再写一个方法?闻到代码重复的臭味了么..... whereClause字串也只有明确知道queryString的主体才能构造,这也违反了dao方法的原意:封装数据访问的细节。在你贴出的代码里面,findPageByCriteria应该是作为基类的一个通用方法,DetachedCriteria是可重用的,它交给调用者构建,保证了分页查询的灵活性。(不过我不喜欢hibernate的api出现在dao层以外,所以我更喜欢用map)
public PaginationSupport findPageByCriteria(
final DetachedCriteria detachedCriteria, final Order order,
final int pageSize, final int startIndex) {
return (PaginationSupport) getHibernateTemplate().execute( new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException {
Criteria criteria = detachedCriteria.getExecutableCriteria(session); int totalCount = ((Integer) criteria.setProjection(
Projections.rowCount()).uniqueResult())
.intValue();
criteria.addOrder(order);
criteria.setProjection(null); List items = criteria.setFirstResult(startIndex)
.setMaxResults(pageSize).list();
PaginationSupport ps = new PaginationSupport(items,
totalCount, pageSize, startIndex);
return ps;
}
}, true);
} 这是我以前用hibernate2的时候写的
public List findByPage(CalPage page, String whereClause) {
String queryString = "select t from "
+ this.clazz.getName()
+ " as t " + whereClause; //Log.log(queryString);
List result = null;
try {
openSession();
Query q = session.createQuery(queryString);
//由于实际取到的从下一位开始, 所以修正
q.setFirstResult(page.getStart() - 1);
q.setMaxResults(page.getRecords());
result = q.list();看看那个高手写的 Criteria,我真想问一下高手,您头不晕吗? 何必呢 何苦呢
我不拿代码叠罗汉就不是 OO 了?
String queryString = "select t from "
+ this.clazz.getName()
+ " as t " + whereClause;
---------------------------------
如果我要查询另外的结果集,加入更多更复杂的条件,需要分页怎么办?再写一个方法?闻到代码重复的臭味了么.....
whereClause字串也只有明确知道queryString的主体才能构造,这也违反了dao方法的原意:封装数据访问的细节。在你贴出的代码里面,findPageByCriteria应该是作为基类的一个通用方法,DetachedCriteria是可重用的,它交给调用者构建,保证了分页查询的灵活性。(不过我不喜欢hibernate的api出现在dao层以外,所以我更喜欢用map)
struts的tag可以说基本上没用,而且最受不了的就是太长了....写多了页面会乱七八糟。比如这个<bean:write name="bean" property="aa.bb.cc" >
用jstl写就是${bean.aa.bb.cc},短多了....
其实要说最适合和美工配合工作的还是用模版技术做视图较好,模版html文件进行可视化编辑容易很多。比如说velocity的
#foreach ($item in $items) <tr><td>${item}</td></tr> #end
在dreamveaver里面就会正常显示,用tag会乱的。