//$Id: HibernateQuerySupport.java,v 1.1 2007-2-9 下午10:29:28 chaostone Exp $
/*
* Copyright c 2005-2009
* Licensed under GNU LESSER General Public License, Version 3.
* http://www.gnu.org/licenses
*
*/
/********************************************************************************
* @author chaostone
*
* MODIFICATION DESCRIPTION
*
* Name Date Description
* ============ ============ ============
*chaostone 2007-2-9 Created
*
********************************************************************************/
package org.beanfuse.query.hibernate;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.lang.StringUtils;
import org.beanfuse.collection.page.PageLimit;
import org.beanfuse.collection.page.SinglePage;
import org.beanfuse.query.AbstractQuery;
import org.beanfuse.query.Condition;
import org.beanfuse.query.EntityQuery;
import org.hibernate.HibernateException;
import org.hibernate.NonUniqueResultException;
import org.hibernate.Query;
import org.hibernate.Session;
/**
* 与hibernate的接口支持
*
* @author chaostone
*
*/
public final class HibernateQuerySupport {
private HibernateQuerySupport() {
super();
}
/**
* 针对查询条件绑定查询的值
*
* @param query
* @param conditions
*/
public static void bindValues(final Query query, final List conditions) {
int position = 0;
boolean hasInterrogation = false; // 含有问号
for (final Iterator iter = conditions.iterator(); iter.hasNext();) {
final Condition condition = (Condition) iter.next();
if (StringUtils.contains(condition.getContent(), "?")) {
hasInterrogation = true;
}
if (hasInterrogation) {
for (final Iterator iterator = condition.getValues().iterator(); iterator.hasNext();) {
query.setParameter(position++, iterator.next());
}
} else {
final List paramNames = condition.getNamedParams();
for (int i = 0; i < paramNames.size(); i++) {
final String name = (String) paramNames.get(i);
final Object value = condition.getValues().get(i);
if (value.getClass().isArray()) {
query.setParameterList(name, (Object[]) value);
} else if (value instanceof Collection) {
query.setParameterList(name, (Collection) value);
} else {
query.setParameter(name, value);
}
}
}
}
}
/**
* 统计该查询的记录数
*
* @param query
* @param hibernateSession
* @return
*/
public static int count(final AbstractQuery query, final Session hibernateSession) {
final String countQueryStr = query.toCountString();
if (StringUtils.isEmpty(countQueryStr)) {
Query hibernateQuery = null;
if (query instanceof EntityQuery) {
hibernateQuery = hibernateSession.createQuery(query.toQueryString());
} else {
hibernateQuery = hibernateSession.createSQLQuery(query.toQueryString());
}
if (query.isCacheable()) {
hibernateQuery.setCacheable(query.isCacheable());
}
setParameter(hibernateQuery, query.getParams());
return hibernateQuery.list().size();
} else {
Query countQuery = null;
if (query instanceof EntityQuery) {
countQuery = hibernateSession.createQuery(countQueryStr);
} else {
countQuery = hibernateSession.createSQLQuery(countQueryStr);
}
if (query.isCacheable()) {
countQuery.setCacheable(query.isCacheable());
}
setParameter(countQuery, query.getParams());
final Number count = (Number) (countQuery.uniqueResult());
if (null == count) {
return 0;
} else {
return count.intValue();
}
}
}
/**
* 查询结果集
*
* @param query
* @param hibernateSession
* @return
*/
public static List find(final AbstractQuery query, final Session hibernateSession) {
Query hibernateQuery = null;
if (query instanceof EntityQuery) {
hibernateQuery = hibernateSession.createQuery(query.toQueryString());
} else {
hibernateQuery = hibernateSession.createSQLQuery(query.toQueryString());
}
if (query.isCacheable()) {
hibernateQuery.setCacheable(query.isCacheable());
}
setParameter(hibernateQuery, query.getParams());
if (null == query.getLimit()) {
return hibernateQuery.list();
} else {
final PageLimit limit = query.getLimit();
hibernateQuery.setFirstResult((limit.getPageNo() - 1) * limit.getPageSize())
.setMaxResults(limit.getPageSize());
return hibernateQuery.list();
}
}
/**
* 查询(如果有分页则返回Pagination)
*
* @param query
* @param hibernateSession
* @return
*/
public static List search(final AbstractQuery query, final Session hibernateSession) {
if (null == query.getLimit()) {
return find(query, hibernateSession);
} else {
return new SinglePage(query.getLimit().getPageNo(), query.getLimit().getPageSize(),
count(query, hibernateSession), find(query, hibernateSession));
}
}
/**
* 查询结果中唯一的对象
*
* @param query
* @param hibernateSession
* @return
* @throws HibernateException
*/
public static Object uniqueResult(final AbstractQuery query, final Session hibernateSession) {
return uniqueElement(find(query, hibernateSession));
}
static Object uniqueElement(final List list) {
final int size = list.size();
if (size == 0) {
return null;
}
final Object first = list.get(0);
for (int i = 1; i < size; i++) {
if (list.get(i) != first) {
throw new NonUniqueResultException(list.size());
}
}
return first;
}
/**
* 为query设置参数
*
* @param query
* @param argument
* @return
*/
public static Query setParameter(final Query query, final Object[] argument) {
if (argument != null && argument.length > 0) {
for (int i = 0; i < argument.length; i++) {
query.setParameter(i, argument[i]);
}
}
return query;
}
/**
* 为query设置参数
*
* @param query
* @param argument
* @return
*/
public static Query setParameter(final Query query, final Map parameterMap) {
if (parameterMap != null && !parameterMap.isEmpty()) {
final Set parameterNameSet = parameterMap.keySet();
for (final Iterator ite = parameterNameSet.iterator(); ite.hasNext();) {
final String parameterName = (String) ite.next();
if (null == parameterName) {
break;
}
final Object parameterValue = parameterMap.get(parameterName);
if (null == parameterValue) {
query.setParameter(parameterName, (Object) null);
} else if (parameterValue.getClass().isArray()) {
query.setParameterList(parameterName, (Object[]) parameterValue);
} else if (parameterValue instanceof Collection) {
query.setParameterList(parameterName, (Collection) parameterValue);
} else {
query.setParameter(parameterName, parameterValue);
}
}
}
return query;
}
}