Java tutorial
/** * Copyright (c) 2005-2010 springside.org.cn * * Licensed under the Apache License, Version 2.0 (the "License"); * * $Id: HibernateDao.java 1205 2010-09-09 15:12:17Z calvinxiu $ */ package com.yize.broadcast.core.hibernate; import com.yize.broadcast.core.page.Page; import org.apache.commons.lang3.StringUtils; import org.hibernate.Criteria; import org.hibernate.Query; import org.hibernate.SessionFactory; import org.hibernate.criterion.Order; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.Assert; import java.io.Serializable; import java.util.List; import java.util.Map; /** * ?SpringSideHibernat DAO. * <p/> * ,?. * ?Service,?DAO?,?. * * @param <T> DAO? * @param <PK> * @author calvin */ public class HibernateDao<T, PK extends Serializable> extends SimpleHibernateDao<T, PK> { /** * Dao?. * ??Class. * eg. * public class UserDao extends HibernateDao<User, Long>{ * } */ public HibernateDao() { super(); } /** * ?Dao, ServiceHibernateDao. * Class. * eg. * HibernateDao<User, Long> userDao = new HibernateDao<User, Long>(sessionFactory, User.class); */ public HibernateDao(final SessionFactory sessionFactory, final Class<T> entityClass) { super(sessionFactory, entityClass); } //-- --// /** * HQL. * * @param page ?. ???orderBy?. * @param hql hql?. * @param values ????,?. * @return , ??. */ @SuppressWarnings("unchecked") @Transactional(readOnly = true) public Page<T> findPage(final Page<T> page, final String hql, final Object... values) { Assert.notNull(page, "page?"); Query q = createQuery(hql, values); if (page.isAutoCount()) { long totalCount = countHqlResult(hql, values); page.setTotalCount(totalCount); } setPageParameterToQuery(q, page); List<T> result = q.list(); page.setResult(result); return page; } /** * HQL. * * @param page ?. ???orderBy?. * @param hql hql?. * @param values ???,??. * @return , ??. */ @SuppressWarnings("unchecked") @Transactional(readOnly = true) public Page<T> findPage(final Page<T> page, final String hql, final Map<String, ?> values) { Assert.notNull(page, "page?"); Query q = createQuery(hql, values); if (page.isAutoCount()) { long totalCount = countHqlResult(hql, values); page.setTotalCount(totalCount); } setPageParameterToQuery(q, page); List<T> result = q.list(); page.setResult(result); return page; } /** * ?Query,. */ protected Query setPageParameterToQuery(final Query q, final Page<T> page) { Assert.isTrue(page.getPageSize() > 0, "Page Size must larger than zero"); //hibernatefirstResult??0 q.setFirstResult(page.getFirst() - 1); q.setMaxResults(page.getPageSize()); return q; } /** * ?Criteria,. */ protected Criteria setPageParameterToCriteria(final Criteria c, final Page<T> page) { Assert.isTrue(page.getPageSize() > 0, "Page Size must larger than zero"); //hibernatefirstResult??0 c.setFirstResult(page.getFirst() - 1); c.setMaxResults(page.getPageSize()); if (page.isOrderBySetted()) { String[] orderByArray = StringUtils.split(page.getOrderBy(), ','); String[] orderArray = StringUtils.split(page.getOrder(), ','); Assert.isTrue(orderByArray.length == orderArray.length, "???,????"); for (int i = 0; i < orderByArray.length; i++) { if (Page.ASC.equals(orderArray[i])) { c.addOrder(Order.asc(orderByArray[i])); } else { c.addOrder(Order.desc(orderByArray[i])); } } } return c; } /** * countHql. * <p/> * ???hql?,??hql?count?. */ @Transactional(readOnly = true) protected long countHqlResult(final String hql, final Object... values) { String countHql = prepareCountHql(hql); try { Long count = findUnique(countHql, values); return count; } catch (Exception e) { throw new RuntimeException("hql can't be auto count, hql is:" + countHql, e); } } /** * countHql. * <p/> * ???hql?,??hql?count?. */ @Transactional(readOnly = true) protected long countHqlResult(final String hql, final Map<String, ?> values) { String countHql = prepareCountHql(hql); try { Long count = findUnique(countHql, values); return count; } catch (Exception e) { throw new RuntimeException("hql can't be auto count, hql is:" + countHql, e); } } private String prepareCountHql(String orgHql) { String fromHql = orgHql; //select??order by???count,?. fromHql = "from " + StringUtils.substringAfter(fromHql, "from"); fromHql = StringUtils.substringBefore(fromHql, "order by"); String countHql = "select count(*) " + fromHql; return countHql; } }