本站首页    管理页面    写新日志    退出


«August 2025»
12
3456789
10111213141516
17181920212223
24252627282930
31


公告
 本博客在此声明所有文章均为转摘,只做资料收集使用。

我的分类(专题)

日志更新

最新评论

留言板

链接

Blog信息
blog名称:
日志总数:1304
评论数量:2242
留言数量:5
访问次数:7592284
建立时间:2006年5月29日




[Hibernate]根据 criteria 自动运算总行数
软件技术

lhwork 发表于 2006/12/29 16:26:12

/** * 根据 DetachedCriteria 得 到 分页结果, 运行期间会根据 criteria 自动运算总行数, 注意如果 criteria 中 set 了 Projection, 则返回结果 List 中为 Projection 指定类型 * @param hibernateTemplate the hibernateTemplate * @param criteria the criteria * @param firstResult the first result row number * @param maxResults the max result * @return the pagination support * @throws org.springframework.dao.DataAccessException in case of Hibernate errors */ public static PaginationSupport findByCriteria(HibernateTemplate hibernateTemplate, final DetachedCriteria criteria, final int firstResult, final int maxResults) throws DataAccessException { return (PaginationSupport) hibernateTemplate.execute(new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Criteria executableCriteria = criteria.getExecutableCriteria(session); // Get the orginal orderEntries OrderEntry[] orderEntries = HibernateUtils.getOrders(executableCriteria); // Remove the orders executableCriteria = HibernateUtils.removeOrders(executableCriteria); // get the original projection Projection projection = HibernateUtils.getProjection(executableCriteria); int totalCount = ((Integer) executableCriteria.setProjection(Projections.rowCount()).uniqueResult()).intValue(); executableCriteria.setProjection(projection); if (projection == null) { // Set the ResultTransformer to get the same object structure with hql executableCriteria.setResultTransformer(CriteriaSpecification.ROOT_ENTITY); } // Add the orginal orderEntries executableCriteria = HibernateUtils.addOrders(executableCriteria, orderEntries); // Now, the Projection and the orderEntries have been resumed List items = HibernateUtils.getPageResult(executableCriteria, firstResult, maxResults); return new PaginationSupport(items, totalCount, firstResult, maxResults); } }, true); } /** * 一些常用的 Hibernate 方法, 注意, 一些方法可能只适用于 Hibernate3.0.5 !!! * @see org.springframework.orm.hibernate3.HibernateTemplate * @since 2005-9-13 * @author 王政 * @version $Id: HibernateUtils.java,v 1.4 2005/09/19 01:00:28 wangzheng Exp $ */ public abstract class HibernateUtils { private static Log logger = LogFactory.getLog(HibernateUtils.class); public static final String CRITERIA_ASSERT_ERROR_MESSAGE = " 's type is not " + CriteriaImpl.class + ", please make sure you are using Hibernate3.0.5!!! "; /** * 将 Criteria 加上分页条件并输出结果 * @param criteria the criteria * @param offset the offset * @param maxPageItems the maxPageItems * @return the result list */ public static List getPageResult(Criteria criteria, int offset, int maxPageItems) throws HibernateException { criteria.setFirstResult(offset); criteria.setMaxResults(maxPageItems); return criteria.list(); } /** * 根据 DetachedCriteria 得 到 分页结果, 运行期间会根据 criteria 自动运算总行数, 注意如果 criteria 中 set 了 Projection, 则返回结果 List 中为 Projection 指定类型 * @param hibernateTemplate the hibernateTemplate * @param criteria the criteria * @param firstResult the first result row number * @param maxResults the max result * @return the pagination support * @throws org.springframework.dao.DataAccessException in case of Hibernate errors */ public static PaginationSupport findByCriteria(HibernateTemplate hibernateTemplate, final DetachedCriteria criteria, final int firstResult, final int maxResults) throws DataAccessException { return (PaginationSupport) hibernateTemplate.execute(new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Criteria executableCriteria = criteria.getExecutableCriteria(session); // Get the orginal orderEntries OrderEntry[] orderEntries = HibernateUtils.getOrders(executableCriteria); // Remove the orders executableCriteria = HibernateUtils.removeOrders(executableCriteria); // get the original projection Projection projection = HibernateUtils.getProjection(executableCriteria); int totalCount = ((Integer) executableCriteria.setProjection(Projections.rowCount()).uniqueResult()).intValue(); executableCriteria.setProjection(projection); if (projection == null) { // Set the ResultTransformer to get the same object structure with hql executableCriteria.setResultTransformer(CriteriaSpecification.ROOT_ENTITY); } // Add the orginal orderEntries executableCriteria = HibernateUtils.addOrders(executableCriteria, orderEntries); // Now, the Projection and the orderEntries have been resumed List items = HibernateUtils.getPageResult(executableCriteria, firstResult, maxResults); return new PaginationSupport(items, totalCount, firstResult, maxResults); } }, true); } /** * 根据 hql 得 到 总行数 * @param hibernateTemplate * @param queryString hql * @param isNamedQuery 是否是 named query * @param paramNames 如果是 named query, 为 named query 中的参数名称, 否则无意义 * @param paramValues 参数值 * @return 满足条件的总行数 * @throws IllegalArgumentException if queryString is blank * @throws org.springframework.dao.DataAccessException in case of Hibernate errors */ public static int getTotalCount(HibernateTemplate hibernateTemplate, String queryString, boolean isNamedQuery, String[] paramNames, Object[] paramValues) throws IllegalArgumentException, DataAccessException { if (StringUtils.isBlank(queryString)) { throw new IllegalArgumentException(" queryString can't be blank "); } String countQueryString = " select count (*) " + JdbcUtils.removeSelect(JdbcUtils.removeOrders(queryString)); List countList; if (isNamedQuery) { countList = hibernateTemplate.findByNamedParam(countQueryString, paramNames, paramValues); } else { countList = hibernateTemplate.find(countQueryString, paramValues); } return ((Integer) countList.get(0)).intValue(); } /** * 从 criteria 中取得 {@link Projection}, 接口中没有公开此方法, 因此从 {@link CriteriaImpl} 中取得 * @see CriteriaImpl#getProjection() * @param criteria the criteria * @return the Projection */ public static Projection getProjection(Criteria criteria) { assertType(criteria); CriteriaImpl impl = (CriteriaImpl) criteria; return impl.getProjection(); } private static void assertType(Criteria criteria) { Assert.notNull(criteria, " criteria is required. "); String message = criteria + CRITERIA_ASSERT_ERROR_MESSAGE; if (! CriteriaImpl.class.isInstance(criteria)) { if (logger.isDebugEnabled()) { logger.debug(message); } throw new SkyonException(message); } } /** * μ玫? criteria 中的 OrderEntry[] * @param criteria the criteria * @return the OrderEntry[] */ public static OrderEntry[] getOrders(Criteria criteria) { assertType(criteria); CriteriaImpl impl = (CriteriaImpl) criteria; Field field = getOrderEntriesField(criteria); try { return (OrderEntry[]) ((List) field.get(impl)).toArray(new OrderEntry[0]); } catch (Exception e) { logAndThrowException(criteria, e); throw new InternalError(" Runtime Exception impossibility can't throw "); } } /** * 移除 criteria 中的 OrderEntry[] * @param criteria the criteria * @return the criteria after removed OrderEntry[] */ public static Criteria removeOrders(Criteria criteria) { assertType(criteria); CriteriaImpl impl = (CriteriaImpl) criteria; try { Field field = getOrderEntriesField(criteria); field.set(impl, new ArrayList()); return impl; } catch (Exception e) { log


阅读全文(5218) | 回复(1) | 编辑 | 精华
 


回复:根据 criteria 自动运算总行数
软件技术

stone(游客)发表评论于2008/4/23 22:18:01

还没试过,但也要谢谢这样的无私奉献


个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
 


» 1 »

发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.063 second(s), page refreshed 144770065 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号