package com.yingfeng.core.hibernate.imp;
import java.io.Serializable;
import java.sql.SQLException;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Projections;
import org.hibernate.engine.SessionFactoryImplementor;
import org.hibernate.hql.ast.QueryTranslatorImpl;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.HibernateTemplate;
import com.yingfeng.core.command.CriteriaCommand;
import com.yingfeng.core.command.QueryFilter;
import com.yingfeng.core.command.SortCommandImpl;
import com.yingfeng.core.hibernate.DynamicDao;
import com.yingfeng.core.web.PageBean;
public class DynamicDaoImpl
implements DynamicDao
{
private String entityClassName;
private SessionFactory sessionFactory;
private HibernateTemplate hibernateTemplate;
public DynamicDaoImpl(String paramString)
{
this.entityClassName = paramString;
}
public DynamicDaoImpl()
{
}
public String getEntityClassName()
{
return this.entityClassName;
}
public void setEntityClassName(String paramString)
{
this.entityClassName = paramString;
}
public SessionFactory getSessionFactory()
{
return this.sessionFactory;
}
public void setSessionFactory(SessionFactory paramSessionFactory)
{
this.sessionFactory = paramSessionFactory;
}
public HibernateTemplate getHibernateTemplate()
{
if (this.hibernateTemplate == null)
this.hibernateTemplate = new HibernateTemplate(this.sessionFactory);
return this.hibernateTemplate;
}
public void setHibernateTemplate(HibernateTemplate paramHibernateTemplate)
{
this.hibernateTemplate = paramHibernateTemplate;
}
public Object save(Object paramObject)
{
getHibernateTemplate().save(this.entityClassName, paramObject);
return paramObject;
}
public Object merge(Object paramObject)
{
getHibernateTemplate().merge(this.entityClassName, paramObject);
return paramObject;
}
public Object get(Serializable paramSerializable)
{
return getHibernateTemplate().load(this.entityClassName, paramSerializable);
}
public void remove(Serializable paramSerializable)
{
getHibernateTemplate().delete(this.entityClassName, get(paramSerializable));
}
public void remove(Object paramObject)
{
getHibernateTemplate().delete(this.entityClassName, paramObject);
}
public void evict(Object paramObject)
{
getHibernateTemplate().evict(paramObject);
}
public Long getTotalItems(String paramString, final Object[] paramArrayOfObject)
{
int i = paramString.toUpperCase().indexOf(" ORDER BY ");
if (i != -1)
paramString = paramString.substring(0, i);
QueryTranslatorImpl localQueryTranslatorImpl = new QueryTranslatorImpl(paramString, paramString, Collections.EMPTY_MAP, (SessionFactoryImplementor)getSessionFactory());
localQueryTranslatorImpl.compile(Collections.EMPTY_MAP, false);
final String str = "select count(1) from (" + localQueryTranslatorImpl.getSQLString() + ") tmp_count_t";
Object localObject = getHibernateTemplate().execute(new HibernateCallback()
{
//str, paramArrayOfObject
public Object doInHibernate(Session paramSession)
throws HibernateException, SQLException
{
SQLQuery localSQLQuery = paramSession.createSQLQuery(str);
if (paramArrayOfObject != null)
for (int i = 0; i < paramArrayOfObject.length; i++)
localSQLQuery.setParameter(i, paramArrayOfObject);
return localSQLQuery.uniqueResult();
}
});
return new Long(localObject.toString());
}
public List<Object> getAll()
{
return (List)getHibernateTemplate().execute(new HibernateCallback()
{
public Object doInHibernate(Session paramSession)
throws HibernateException, SQLException
{
String str = "from " + DynamicDaoImpl.this.entityClassName;
Query localQuery = paramSession.createQuery(str);
return localQuery.list();
}
});
}
public List<Object> getAll(final PageBean paramPageBean)
{
final String str = "from " + this.entityClassName;
int i = getTotalItems(str, null).intValue();
paramPageBean.setTotalItems(i);
return (List)getHibernateTemplate().execute(new HibernateCallback()
{
//str, paramPageBean
public Object doInHibernate(Session paramSession)
throws HibernateException, SQLException
{
Query localQuery = paramSession.createQuery(str);
localQuery.setFirstResult(paramPageBean.getFirstResult()).setFetchSize(paramPageBean.getPageSize().intValue());
localQuery.setMaxResults(paramPageBean.getPageSize().intValue());
return localQuery.list();
}
});
}
public List<Object> getAll(final QueryFilter paramQueryFilter)
{
int i = getCountByFilter(paramQueryFilter);
paramQueryFilter.getPageBean().setTotalItems(i);
List localList = (List)getHibernateTemplate().execute(new HibernateCallback()
{
public Object doInHibernate(Session paramSession)
throws HibernateException, SQLException
{
Criteria localCriteria = paramSession.createCriteria(DynamicDaoImpl.this.entityClassName);
paramQueryFilter.getAliasSet().clear();
DynamicDaoImpl.this.setCriteriaByQueryFilter(localCriteria, paramQueryFilter);
return localCriteria.list();
}
});
return localList;
}
protected int getCountByFilter(final QueryFilter paramQueryFilter)
{
Object localObject = getHibernateTemplate().execute(new HibernateCallback()
{
public Object doInHibernate(Session paramSession)
throws HibernateException, SQLException
{
Criteria localCriteria = paramSession.createCriteria(DynamicDaoImpl.this.entityClassName);
for (int i = 0; i < paramQueryFilter.getCommands().size(); i++)
{
CriteriaCommand localCriteriaCommand = (CriteriaCommand)paramQueryFilter.getCommands().get(i);
if ((localCriteriaCommand instanceof SortCommandImpl))
continue;
localCriteria = localCriteriaCommand.execute(localCriteria);
}
localCriteria.setProjection(Projections.rowCount());
return localCriteria.uniqueResult();
}
});
if (localObject == null)
return new Integer(0).intValue();
return new Integer(localObject.toString()).intValue();
}
private Criteria setCriteriaByQueryFilter(Criteria paramCriteria, QueryFilter paramQueryFilter)
{
for (int i = 0; i < paramQueryFilter.getCommands().size(); i++)
paramCriteria = ((CriteriaCommand)paramQueryFilter.getCommands().get(i)).execute(paramCriteria);
paramCriteria.setFirstResult(paramQueryFilter.getPageBean().getFirstResult());
paramCriteria.setMaxResults(paramQueryFilter.getPageBean().getPageSize().intValue());
return paramCriteria;
}
}
package com.yingfeng.core.hibernate;
import java.io.Serializable;
import java.util.List;
import com.yingfeng.core.command.QueryFilter;
import com.yingfeng.core.web.PageBean;
public abstract interface DynamicDao
{
public abstract Object save(Object paramObject);
public abstract Object merge(Object paramObject);
public abstract Object get(Serializable paramSerializable);
public abstract void remove(Serializable paramSerializable);
public abstract void remove(Object paramObject);
public abstract void evict(Object paramObject);
public abstract List<Object> getAll();
public abstract List<Object> getAll(PageBean paramPagingBean);
public abstract List<Object> getAll(QueryFilter paramQueryFilter);
public String getEntityClassName();
public void setEntityClassName(String paramString);
}
package com.yingfeng.core.web;
public class PageBean
{
public static final String PAGING_BEAN = "_paging_bean";
public static Integer DEFAULT_PAGE_SIZE = Integer.valueOf(25);
public static final int SHOW_PAGES = 6;
public Integer start;
private Integer pageSize;
private Integer totalItems;
public PageBean(int paramInt1, int paramInt2)
{
this.pageSize = Integer.valueOf(paramInt2);
this.start = Integer.valueOf(paramInt1);
}
public Integer getPageSize()
{
return this.pageSize;
}
public void setPageSize(int paramInt)
{
this.pageSize = Integer.valueOf(paramInt);
}
public int getTotalItems()
{
return this.totalItems.intValue();
}
public Integer getStart()
{
return this.start;
}
public void setStart(Integer paramInteger)
{
this.start = paramInteger;
}
public void setTotalItems(Integer paramInteger)
{
this.totalItems = paramInteger;
}
public void setTotalItems(int paramInt)
{
this.totalItems = Integer.valueOf(paramInt);
}
public int getFirstResult()
{
return this.start.intValue();
}
}