?? abstractdaohibernate.java
字號:
/**
*
*/
package com.lily.dap.dao.hibernate;
import java.io.Serializable;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Time;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.type.Type;
import org.springframework.orm.ObjectRetrievalFailureException;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import com.lily.dap.Constants;
import com.lily.dap.dao.Dao;
import com.lily.dap.dao.QueryCallback;
import com.lily.dap.dao.TransitionCallback;
import com.lily.dap.dao.support.DaoHelper;
import com.lily.dap.model.QueryCondition;
import com.lily.dap.model.QueryExpression;
import com.lily.dap.model.QueryOrder;
/**
* @author zouxuemo
*
*/
public class AbstractDaoHibernate extends HibernateDaoSupport implements Dao {
protected final Log logger = LogFactory.getLog(getClass());
/* (non-Javadoc)
* @see com.lily.dap.dao.BasetDao#get(java.lang.Class, java.io.Serializable)
*/
public Object get(Class clazz, Serializable id)
throws ObjectRetrievalFailureException {
Object o = getHibernateTemplate().get(clazz, id);
if (o == null) {
logger.warn("給定id為[" + id + "]的" + clazz.getName() + "對象沒找到...");
throw new ObjectRetrievalFailureException(clazz, id);
}
return o;
}
/* (non-Javadoc)
* @see com.lily.dap.dao.BasetDao#save(java.lang.Object)
*/
public void save(Object o) {
getHibernateTemplate().saveOrUpdate(o);
}
/* (non-Javadoc)
* @see com.lily.dap.dao.BasetDao#remove(java.lang.Class, java.io.Serializable)
*/
public void remove(Class clazz, Serializable id)
throws ObjectRetrievalFailureException {
remove(get(clazz, id));
}
public void remove(Object entity) {
getHibernateTemplate().delete(entity);
}
/* (non-Javadoc)
* @see com.lily.dap.dao.BasetDao#reload(java.lang.Object)
*/
public void reload(Object object) {
getHibernateTemplate().refresh(object);
}
/* (non-Javadoc)
* @see com.lily.dap.dao.BasetDao#gets(java.lang.Class, com.lily.dap.model.QueryCondition)
*/
public List gets(Class clazz, QueryCondition queryCondition) {
return gets(clazz, queryCondition, null);
}
/* (non-Javadoc)
* @see com.lily.dap.dao.BasetDao#gets(java.lang.Class, com.lily.dap.model.QueryCondition, com.lily.dap.model.QueryCallBack)
*/
public List gets(Class clazz, QueryCondition queryCondition, QueryCallback callBack) {
String hql = parseQueryCondition(clazz, queryCondition, callBack);
if ( logger.isDebugEnabled() ) {
logger.debug("gets - [" + hql + "]...");
}
return executeFind(hql, queryCondition.getPageNo(), queryCondition.getPageSize());
}
public long count(Class clazz, QueryCondition queryCondition) {
return count(clazz, queryCondition, null);
}
public long count(Class clazz, QueryCondition queryCondition, QueryCallback callBack) {
String hql = parseQueryCondition(clazz, queryCondition, callBack);
int index = hql.indexOf("group by");
if (index < 0)
index = hql.indexOf("order by");
if (index >= 0)
hql = hql.substring(0, index);
hql = "select count(*) " + hql.substring(hql.indexOf("from"));
if ( logger.isDebugEnabled() ) {
logger.debug("count - [" + hql + "]...");
}
List result = executeFind(hql);
long count = 0;
if (result.size() > 0)
count = ((Long)result.get(0)).longValue();
return count;
}
private String parseQueryCondition(Class clazz, QueryCondition queryCondition, QueryCallback callBack) {
StringBuffer buf = new StringBuffer();
//如果指定了要返回的字段,則構造選擇字段的HQL語句
if (queryCondition.getSelects() != null && queryCondition.getSelects().length > 0) {
String[] selects = queryCondition.getSelects();
buf.append("select ").append(selects[0]);
for (int i = 1; i < selects.length; i++)
buf.append(",").append(selects[i]);
buf.append(" ");
}
buf.append("from ").append(clazz.getName()).append(" where ");
//從查詢表達式列表讀取查詢表達式,檢查表達式字段是否屬于類中的屬性值,檢查表達式操作是否支持,構造HQL條件語句
queryCondition.beginFindCondition();
QueryExpression expression;
while ((expression = queryCondition.findNextCondition()) != null) {
if (callBack != null) {
String cond = callBack.parseCondition(expression);
if (cond != null && !"".equals(cond)){
if (!QueryCallback.IGRONE.equals(cond))
buf.append(cond).append(" and ");
continue;
}
}
String name = expression.getName();
Class type;
Method method = null;
try {
method = DaoHelper.getMethod(clazz, name);
} catch (SecurityException e) {
logger.warn("給定的查詢字段[" + name + "]在[" + clazz.getName() + "]類中不允許操作!");
continue;
} catch (NoSuchMethodException e) {
logger.warn("給定的查詢字段[" + name + "]在[" + clazz.getName() + "]類中不存在!");
continue;
}
type = method.getReturnType();
String expressionType = expression.getType();
boolean isSingleQuotesFlag = false;
if (expressionType != null) {
if(QueryExpression.TYPE_STRING.equals(expressionType) || QueryExpression.TYPE_DATE.equals(expressionType))
isSingleQuotesFlag = true;
} else if (type == String.class || type == Date.class || type == Time.class || type == Timestamp.class) {
isSingleQuotesFlag = true;
}
String value = DaoHelper.expressionValue2String(expression.getValue());
//如果是數值型,則如果條件值為Constants.RETRIEVE_ALL時忽略該條件。如果是字符串型,則如果條件值為空字符串時忽略該條件
if ("long".equals(type.getName()) || "int".equals(type.getName()) || type == Long.class || type == Integer.class) {
if (value.equals(String.valueOf(Constants.RETRIEVE_ALL)))
continue;
} else if (type == String.class) {
if ("".equals(value))
continue;
}
//其他類型就要求提供查詢值
if ("".equals(value)) {
logger.warn("給定的查詢字段[" + name + ":" + type.getName() + "]必須輸入查詢條件值!");
continue;
}
String op = expression.getOp();
if (QueryExpression.OP_EQ.equals(op) ||
QueryExpression.OP_NE.equals(op) ||
QueryExpression.OP_GE.equals(op) ||
QueryExpression.OP_GT.equals(op) ||
QueryExpression.OP_LE.equals(op) ||
QueryExpression.OP_LT.equals(op)) {
buf.append(name).append(" ").append(op).append(" ");
if (isSingleQuotesFlag)
buf.append("'").append(value).append("'");
else
buf.append(value);
buf.append(" and ");
} else if (QueryExpression.OP_LIKE.equals(op)) {
buf.append(name).append(" like '%").append(value).append("%' and ");
} else if (QueryExpression.OP_LLIKE.equals(op)) {
buf.append(name).append(" like '%").append(value).append("' and ");
} else if (QueryExpression.OP_RLIKE.equals(op)) {
buf.append(name).append(" like '").append(value).append("%' and ");
} else if (QueryExpression.OP_IN.equals(op) || QueryExpression.OP_NOTIN.equals(op)) {
if (QueryExpression.OP_IN.equals(op))
buf.append(name).append(" in (");
else
buf.append(name).append(" not in (");
StringTokenizer valuest = new StringTokenizer(value, QueryExpression.VALUE_SPLIT);
int c = 0;
while (valuest.hasMoreTokens()) {
String val = valuest.nextToken();
if (c++ > 0)
buf.append(", ");
if (isSingleQuotesFlag)
buf.append("'").append(val).append("'");
else
buf.append(val);
}
buf.append(") and ");
} else if (QueryExpression.OP_INCLUDE.equals(op)) {
int[] ary = DaoHelper.parseNumExpression(value);
if (ary.length == 0) {
logger.warn("給定的include查詢操作值[" + value + "]格式錯誤!");
continue;
}
buf.append(name).append(" in (").append(ary[0]);
for (int i = 1; i < ary.length; i++)
buf.append(", ").append(ary[0]);
buf.append(") and ");
} else if (QueryExpression.OP_INQUERY.equals(op)) {
buf.append(name).append(" in (").append(value).append(") and ");
} else {
logger.warn("對" + name + "的查詢操作[" + op + "]不可識別!");
continue;
}
}
if (" and ".equals(buf.substring(buf.length() - 5)))
buf = buf.delete(buf.length() - 5, buf.length());
else
buf = buf.delete(buf.length() - 7, buf.length());
if (queryCondition.getGroupbys() != null && queryCondition.getGroupbys().length > 0) {
String[] groupbys = queryCondition.getGroupbys();
buf.append(" group by ").append(groupbys[0]);
for (int i = 1; i < groupbys.length; i++)
buf.append(",").append(groupbys[i]);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -