public class BaseDao extends HibernateDaoSupport{
protected static Logger logger = Logger.getRootLogger();
/**
* 查询单个实例,HQL实现
*
* @param select
* @param values
* @return
*/
public Object queryForObject(final String select, final Object[] values) {
HibernateCallback selectCallback = new HibernateCallback() {
public Object doInHibernate(Session session) {
Query query = session.createQuery(select);
if (values != null) {
for (int i = 0; i < values.length; i++) {
query.setParameter(i, values[i]);
}
}
return query.setMaxResults(1).uniqueResult();
}
};
return this.getHibernateTemplate().execute(selectCallback);
}
/**
* SQL查询列表
* @param select
* @param values
* @return
*/
public List<Object[]> sqlForList(final String select, final Object[] values,final LinkedHashMap<String,Type> map) {
HibernateCallback selectCallback = new HibernateCallback() {
public List<Object[]> doInHibernate(Session session) {
SQLQuery query = session.createSQLQuery(select);
if (values != null) {
for (int i = 0; i < values.length; i++) {
query.setParameter(i, values[i]);
}
}
for(String o:map.keySet()){
query.addScalar(o, map.get(o));
}
return query.list();
}
};
return (List<Object[]>)this.getHibernateTemplate().execute(selectCallback);
}
/**
* SQL查询列表
* @param select
* @param values
* @return
*/
public List<Object[]> sqlForList(final String select, final Object[] values,final LinkedHashMap<String,Type> map,final Page page) {
HibernateCallback selectCallback = new HibernateCallback() {
public List<Object[]> doInHibernate(Session session) {
SQLQuery query = session.createSQLQuery(select);
if (values != null) {
for (int i = 0; i < values.length; i++) {
query.setParameter(i, values[i]);
}
}
for(String o:map.keySet()){
query.addScalar(o, map.get(o));
}
List<Object[]> l = query.setFirstResult(page.getFirstResult())
.setMaxResults(page.getPageSize()).list();
return l;
}
};
return (List<Object[]>)this.getHibernateTemplate().execute(selectCallback);
}
/**
* 这个为下面的方法调用
*
* @param select
* @param values
* @param page
* @return
*/
public List queryForList(final String select, final Object[] values,
final Page page) {
HibernateCallback selectCallback = new HibernateCallback() {
public Object doInHibernate(Session session) {
Query query = session.createQuery(select);
if (values != null) {
for (int i = 0; i < values.length; i++) {
query.setParameter(i, values[i]);
}
}
return query.setFirstResult(page.getFirstResult())
.setMaxResults(page.getPageSize()).list();
}
};
return (List) this.getHibernateTemplate().execute(selectCallback);
}
/**
* 这个为下面的方法调用
*
* @param select
* @param values
* @param page
* @return
*/
public List queryForList(final String select, final Object[] values) {
HibernateCallback selectCallback = new HibernateCallback() {
public Object doInHibernate(Session session) {
Query query = session.createQuery(select);
if (values != null) {
for (int i = 0; i < values.length; i++) {
query.setParameter(i, values[i]);
}
}
return query.list();
}
};
return (List) this.getHibernateTemplate().execute(selectCallback);
}
/**
*
* @param selectCount
* 查总数
* @param select
* 查询语句
* @param values
* 参数
* @param page
* @return
*/
public List<?> queryForList(final String selectCount, final String select,
final Object[] values, final Page page) {
Integer Count = (Integer) queryForObject(selectCount, values);
page.setTotalCount(Count.intValue());
if (page.isEmpty()) {
return Collections.EMPTY_LIST;
}
List<?> list=queryForList(select, values, page);
return list;
}
/**
* 用于地域查询,构造hql中的region_id语句
*
* @param regionId
* @return
*/
protected String genRegionHql(int regionId) {
String regionIDString = "" + regionId;
int index = regionIDString.length() - 1;
while (regionIDString.charAt(index) == '0') {
index--;
}
int bit = (int) Math.pow(10, regionIDString.length() - index - 1);
int minRegionId = (regionId / bit) * bit;
int maxRegionId = minRegionId + bit - 1;
StringBuffer buffer = new StringBuffer();
if (regionId > minRegionId) {
buffer.append(" region_id =" + regionId);
} else {
buffer.append(" region_id >=" + minRegionId + " and region_id <"
+ maxRegionId);
}
return buffer.toString();
}
/**
* 随机查询
*/
public Object randomQueryForObject(List<Factor4Query> list, Class clazz)
{
String className = CharUtil.getClassName(clazz);
StringBuilder buffer = new StringBuilder();
StringBuilder buffRand = new StringBuilder();
List<Object> objs = new ArrayList<Object>(0);
buffer.append(" from ").append(className).append(" where id >=");
buffRand.append(" select ROUND(RAND()*( max(id)-min(id)))+min(id) from ")
.append(className).append(" where 1=1 ");
StringBuilder builder = new StringBuilder("");
for(Factor4Query f : list){
builder.append(getQueryCondition( f, objs));
}
buffRand.append(builder);
// int size = objs.size();
// for(int i = 0; i < size; i++){
// objs.add(objs.get(i));
// }
Object[] arr = objs.toArray();
String hqlRand = buffRand.toString();
Integer randId = (Integer) this.queryForObject(hqlRand, arr);
buffer.append(randId);
buffer.append(builder).append(" order by id asc limit 1");
String hql = buffer.toString();
Object obj = this.queryForObject(hql, arr);
return obj;
}
public Object queryForObject(List<Factor4Query> list, Class clazz)
{
String className = CharUtil.getClassName(clazz);
StringBuilder buffer = new StringBuilder();
List<Object> objs = new ArrayList<Object>(0);
buffer.append(" from ").append(className).append(" t where 1=1");
StringBuilder builder = new StringBuilder("");
for(Factor4Query f : list){
builder.append(getQueryCondition(f, objs));
}
buffer.append(builder.toString());
String hql = buffer.toString();
Object[] arr = objs.toArray();
Object obj = this.queryForObject(hql, arr);
return obj;
}
private StringBuilder getQueryCondition(Factor4Query factor, List<Object> objs)
{
StringBuilder hql = new StringBuilder("");
if(factor.getOpt()==Factor4Query.EQUAL && factor.getValue()!=null){
hql.append(" and "+factor.getField()+" =? ");
objs.add(factor.getValue());
}
else if(factor.getOpt()==Factor4Query.LESS && factor.getValue()!=null){
hql.append(" and "+factor.getField()+" <? ");
objs.add(factor.getValue());
}
else if(factor.getOpt()==Factor4Query.LESS_EQUAL && factor.getValue()!=null){
hql.append(" and "+factor.getField()+" <=? ");
objs.add(factor.getValue());
}
else if(factor.getOpt()==Factor4Query.MORE && factor.getValue()!=null){
hql.append(" and "+factor.getField()+" >? ");
objs.add(factor.getValue());
}
else if(factor.getOpt()==Factor4Query.MORE_EQUAL && factor.getValue()!=null){
hql.append(" and "+factor.getField()+" >=? ");
objs.add(factor.getValue());
}
else if(factor.getOpt()==Factor4Query.UNEQUAL && factor.getValue()!=null){
hql.append(" and "+factor.getField()+" <> ("+factor.getValue()+") ");
}
else
if(factor.getOpt()==Factor4Query.BETW && factor.getMinValue()!=null && factor.getMaxValue()!=null){
hql.append(" and "+factor.getField()+" between ? and ? ");
objs.add(factor.getMinValue());
objs.add(factor.getMaxValue());
}
else if(factor.getOpt()==Factor4Query.NOTBETW && factor.getMinValue()!=null && factor.getMaxValue()!=null){
hql.append(" and "+factor.getField()+" not between ? and ? ");
objs.add(factor.getMinValue());
objs.add(factor.getMaxValue());
}
else
if(factor.getOpt()==Factor4Query.SET && factor.getValues() != null){//?
hql.append(" and "+factor.getField()+" in ("+factor.getValues()+") ");
}
else if(factor.getOpt()==Factor4Query.NOTINSET && factor.getValues() != null){//?
hql.append(" and "+factor.getField()+" not in ("+factor.getValues()+") ");
}
else if(factor.getOpt()==Factor4Query.LIKE && factor.getValue() != null){
hql.append(" and "+factor.getField()+" like ? ");
Object o = "%"+factor.getValue()+"%";
objs.add(o);
}
else if(factor.getOpt()==Factor4Query.ORDER && factor.getValue()==null){
hql.append(" order by "+factor.getField());
if(factor.getValue()==new Integer(1)){
hql.append(" asc");
}else{
hql.append(" desc");
}
}
if(hql.length() <=0 && factor.getAllowNullQuery()){
hql.append(" and "+factor.getField()+" is null");
}
return hql;
}
/**
* 后台结算数据查询查询总记录数
* @param select
* @param values
* @param map
* @return
*/
public Integer sqlOfRecordTotal(final String select, final Object[] values,final LinkedHashMap<String,Type> map) {
HibernateCallback selectCallback = new HibernateCallback() {
public Integer doInHibernate(Session session) {
SQLQuery query = session.createSQLQuery(select);
if (values != null) {
for (int i = 0; i < values.length; i++) {
query.setParameter(i, values[i]);
}
}
for(String o:map.keySet()){
query.addScalar(o, map.get(o));
}
return (Integer)query.uniqueResult();
}
};
return (Integer)this.getHibernateTemplate().execute(selectCallback);
}
public List<?> sqlQuery(final String select, final Object[] values,final LinkedHashMap<String,Type> map,final Page page) {
HibernateCallback selectCallback = new HibernateCallback() {
public List<?> doInHibernate(Session session) {
SQLQuery query = session.createSQLQuery(select);
if (values != null) {
for (int i = 0; i < values.length; i++) {
query.setParameter(i, values[i]);
}
}
for(String o:map.keySet()){
query.addScalar(o, map.get(o));
}
List<?> l = query.setFirstResult(page.getFirstResult())
.setMaxResults(page.getPageSize()).list();
return l;
}
};
return (List<?>)this.getHibernateTemplate().execute(selectCallback);
}
}