Index: forgon-tools/src/main/java/com/forgon/tools/hibernate/ObjectDao.java =================================================================== diff -u -r16856 -r16953 --- forgon-tools/src/main/java/com/forgon/tools/hibernate/ObjectDao.java (.../ObjectDao.java) (revision 16856) +++ forgon-tools/src/main/java/com/forgon/tools/hibernate/ObjectDao.java (.../ObjectDao.java) (revision 16953) @@ -184,4 +184,51 @@ */ List> findSqlByParam(String sql, Object[] condition); + /** + * 使用预编译的本地sql查询(分页) + * @param sql 要查询的sql + * @param condition 预编译的条件(数组类型) + * @param start 分页的开始 + * @param limit 分页的大小 + * @return + */ + List> findSqlByParam(String sql, Object[] condition, int start, int limit); + + /** + * + * @param sql 要查询的sql + * @param condition 预编译的条件(list类型) + * @param start 分页的开始 + * @param limit 分页的大小 + * @return + */ + List> findSqlByParam(String sql, List condition, int start, int limit); + + + + /** + * 使用预编译的hql查询(分页) + * @param hql 要查询的hql + * @param condition 预编译的条件(数组类型) + * @param start 分页的开始 + * @param limit 分页的大小 + * @param clazz 根据这个是否为空来判断返回哪种List类型,如果不为空,则可以进行整个类属性的查询(例:from User),如果为空则进行List map查询 + * @return + */ + List findHqlByParam(String hql, Object[] condition, int start, int limit, Class clazz); + + + /** + * 使用预编译的hql查询(分页) + *

注:此方法只能用于查询个别属性,hql要写select属性,而且要使用as使用别名才能映射到map中(例:select u.fullName as fullName from User u), + * 不能用于整个对象的查询(例:from User),这样map会取不出来

+ * @see ObjectDao#findHqlByParam(String, Object[], int, int, Class) + * @param hql 要查询的hql + * @param condition 预编译的条件(数组类型) + * @param start 分页的开始 + * @param limit 分页的大小 + * @return + */ + List findHqlByParam(String hql, Object[] condition, int start, int limit); + } Index: forgon-tools/src/main/java/com/forgon/tools/hibernate/ObjectDaoImpl.java =================================================================== diff -u -r16856 -r16953 --- forgon-tools/src/main/java/com/forgon/tools/hibernate/ObjectDaoImpl.java (.../ObjectDaoImpl.java) (revision 16856) +++ forgon-tools/src/main/java/com/forgon/tools/hibernate/ObjectDaoImpl.java (.../ObjectDaoImpl.java) (revision 16953) @@ -15,7 +15,6 @@ import java.util.Map; import org.apache.commons.beanutils.BeanUtils; -import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.hibernate.CacheMode; @@ -155,29 +154,94 @@ } - @Override public List> findSqlByParam(String sql, List condition) { + return this.findSqlByParam(sql, condition, 0, 0); + } + + @Override + public List> findSqlByParam(String sql, Object[] condition) { + return this.findSqlByParam(sql, condition, 0, 0); + } + + + @Override + public List> findSqlByParam(String sql, Object[] condition, int start, int limit) { SQLQuery query = this.getHibernateSession().createSQLQuery(sql); + this.setQueryParamArr(query, condition); + this.buildPage(query, start, limit); + return this.buildResultMap(query); + } + + @Override + public List> findSqlByParam(String sql, List condition, int start, int limit) { + SQLQuery query = this.getHibernateSession().createSQLQuery(sql); + this.setQueryParamList(query, condition); + this.buildPage(query, start, limit); + return this.buildResultMap(query); + } + + @Override + public List findHqlByParam(String hql, Object[] condition, int start, int limit, Class clazz) { + Query query = this.getHibernateSession().createQuery(hql); + this.setQueryParamArr(query, condition); + this.buildPage(query, start, limit); + return clazz == null ? this.buildResultMap(query) : query.list(); + } + + + @Override + public List findHqlByParam(String hql, Object[] condition, int start, int limit) { + return this.findHqlByParam(hql, condition, start, limit, null); + } + + /** + * 设置query参数(参数是List形式) + * @param query {@link Query} + * @param condition 参数 + */ + private void setQueryParamList(Query query, List condition){ for (int i = 0, size = condition.size(); i < size; i++) { query.setParameter(i, condition.get(i)); } - query.setResultTransformer(CriteriaSpecification.ALIAS_TO_ENTITY_MAP); - return query.list(); } - @Override - public List> findSqlByParam(String sql, Object[] condition) { - SQLQuery query = this.getHibernateSession().createSQLQuery(sql); + /** + * 设置query参数(参数是数组形式) + * @param query {@link Query} + * @param condition 参数 + */ + private void setQueryParamArr(Query query, Object[] condition){ for (int i = 0, size = condition.length; i < size; i++) { query.setParameter(i, condition[i]); } + } + + /** + * 构建map的返回结果 + * @param query + * @return + */ + private List> buildResultMap(Query query){ query.setResultTransformer(CriteriaSpecification.ALIAS_TO_ENTITY_MAP); return query.list(); } + /** + * 设置分页 + * @param query + * @param start + * @param limit + */ + private void buildPage(Query query, int start, int limit){ + if (start >= 0 && limit > 0){ + query.setFirstResult(start); + query.setMaxResults(limit); + } + } + public Object getByProperty(String objectPOName, String propertyName, - Object propertyValue) { + Object propertyValue) { // Object po = null; // List list = getHibernateTemplate().find( // "from " + objectPOName + " po where po." + propertyName + "=?",