Hibernate 泛型DAO实现代码
发布时间:2020-05-24 22:20:56 所属栏目:Java 来源:互联网
导读:Hibernate 泛型DAO实现代码
|
下面是脚本之家 jb51.cc 通过网络收集整理的代码片段。 脚本之家小编现在分享给大家,也给大家做个参考。 importjava.io.Serializable;
importjava.util.List;
importorg.hibernate.Criteria;
importorg.hibernate.Query;
importorg.hibernate.SQLQuery;
importorg.hibernate.criterion.Criterion;
/**
*
*HibernateGenericDAOInterface
*
*@param<T> Entity
*@param<PK>PrimaryKey
*/
publicinterfaceGenericDaoIf<T,PKextendsSerializable>{
/**
*Getentitybyprimarykey
*@paramidPrimarykey
*@returnEntityobject
*/
publicTget(finalPKid);
/**
*Loadentitybyprimarykey
*@paramidPrimarykey
*@returnEntityobject
*/
publicTload(finalPKid);
/**
*Removeentityfromsession,changestothisentitywill
*notbesynchronizedwiththedatabase
*@paramentityTheobjecttobeevicted
*/
publicvoidevict(Tentity);
/**
*Saveentity
*@paramentityTheobjecttobesaved
*@returnThegeneratedidentifier
*/
publicPKsave(Tentity);
/**
*Updateentity
*@paramentityTheobjecttobeupdated
*/
publicvoidupdate(Tentity);
/**
*Saveorupdateentity
*@paramentityTheobjecttobesaveorupdate
*/
publicvoidsaveOrUpdate(Tentity);
/**
*Updateentity'snot-nullproperty
*(thisentitymusthaveaprimarykeyproperty"id")
*@paramentityTheobjecttobeupdated
*/
publicvoidupdateSelective(Tentity);
/**
*Mergeentity
*@paramentityTheobjecttobemergedintodatabase
*@returnThepersistentobject
*/
publicTmerge(Tentity);
/**
*Deleteentity(actually,deletebyprimarykey)
*@paramentityTheobjecttobedeleted
*/
publicvoiddelete(Tentity);
/**
*Deleteentitybyprimarykey,firstgetthendelete
*@paramidPrimarykey
*/
publicvoiddelete(PKid);
/**
*Findallentities
*@returnQueryresultlist
*/
publicList<T>findAll();
/**
*Findentitiesbypage
*@parampagePagingobject
*@returnPagingqueryresult,Comeswitharesultslist
*/
publicPage<T>findAll(Page<T>page);
/**
*PresstheHQLQueryobjectlist
*@paramhql
* HQLstatement
*@paramvalues
* Numberofvariableparameters
*@returnQueryresultlist
*/
publicList<T>find(Stringhql,Object...values);
/**
*PresstheSQLQueryobjectlist
*@paramsql
* SQLstatement
*@paramvalues
* Numberofvariableparameters
*@returnQueryresultlist
*/
publicList<T>findBySql(Stringsql,Object...values);
/**
*PresstheHQLquerypaging.
*@parampage
* Pagingparameters.
*@paramhql
* HQLstatement.
*@paramvalues
* Numberofvariableparameters.
*@returnPagingqueryresults,Comeswitharesultslist.
*/
publicPage<T>find(Page<T>page,Stringhql,Object...values);
/**
*PresstheSQLquerypaging.
*@parampage
* Pagingparameters.
*@paramsql
* SQLstatement.
*@paramvalues
* Numberofvariableparameters.
*@returnPagingqueryresults,Comeswitharesultslist.
*/
publicPage<T>findBySql(Page<T>page,Stringsql,Object...values);
/**
*PresstheHQLqueryonlyobject
*@paramhql
* HQLstatement
*@paramvalues
* Numberofvariableparameters
*@returnAsingleinstancethatmatchesthequery,ornullifthequeryreturnsnoresults
*/
publicObjectfindUnique(Stringhql,Object...values);
/**
*PresstheSQLqueryonlyobject
*@paramsql
* SQLstatement
*@paramvalues
* Numberofvariableparameters
*@returnAsingleinstancethatmatchesthequery,ornullifthequeryreturnsnoresults
*/
publicObjectfindUniqueBySql(Stringsql,Object...values);
/**
*AccordingtotheCriterionqueryobjectlist.
*@paramcriterion
*NumberofvariableCriterion.
*@returnQueryresultlist
*/
publicList<T>findByCriteria(Criterion...criterion);
/**
*AccordingtotheCriterionpagingquery.
*@parampage
*Pagingparameters.IncludingthepageSize,firstResult,orderBy,asc,autoCount.
*WherefirstResultcanbedirectlyspecified,YoucanalsospecifypageNo.autoCountSpecifieswhetherdynamicgetstotalnumberofresults.
*@paramcriterion
*Numberofvariablecriterion.
*@returnPagingqueryresults.Comeswitharesultslistandallqueryparameters.
*/
publicPage<T>findByCriteria(Page<T>page,Criterion...criterion);
/**
*Findalistofobjectsbyproperty.
*@parampropertyNamePropertynameoftheentity
*@paramvaluePropertyvalue
*@returnQueryresultlist
*/
publicList<T>findByProperty(StringpropertyName,Objectvalue);
/**
*Finduniqueobjectbyproperty.
*@parampropertyNamePropertynameoftheentity
*@paramvaluePropertyvalue
*@returnAsingleinstancethatmatchesthequery,ornullifthequeryreturnsno
*/
publicTfindUniqueByProperty(StringpropertyName,Objectvalue);
/**
*Determinetheobject'spropertyvalueisuniquewithinthedatabase.
*@parampropertyNamePropertynameoftheentity
*@paramnewValueNewpropertyvalue
*/
publicbooleanisPropertyUnique(StringpropertyName,ObjectnewValue);
/**
*DependingonthequeryfunctionandargumentlisttocreateaQueryobject,Subsequenttoprocessing,Theauxiliaryfunction.
*@paramqueryStringHQLstring
*@paramvaluesNumberofvariableparameters
*@returnQueryobject
*/
publicQuerycreateQuery(StringqueryString,Object...values);
/**
*DependingonthequeryfunctionandargumentlisttocreateaSQLQueryobject,Theauxiliaryfunction.
*@paramqueryStringSQLstring
*@paramvaluesNumberofvariableparameters
*@returnSQLqueryobject
*/
publicSQLQuerycreateSQLQuery(StringqueryString,Object...values);
/**
*AccordingtotheCriterionconditionscreateCriteria,Theauxiliaryfunction.
*@paramcriterionsNumberofvariablecriterion
*@returnAcriteria
*/
publicCriteriacreateCriteria(Criterion...criterions);
/**
*CountHQLqueryresult
*@paramhqlHQLstatement
*@paramvaluesNumberofvariableparameters
*@returnResultcount
*/
publiclongcountQueryResult(Stringhql,Object...values);
/**
*CountSQLqueryresult
*@paramsqlHQLstatement
*@paramvaluesNumberofvariableparameters
*@returnResultcount
*/
publiclongcountSQLQueryResult(Stringsql,Object...values);
/**
*Throughthiscountquerytoobtainthetotalnumberofobjects.
*@parampagePagingobject
*@paramcQuerycriteria
*@returnThetotalnumberofobjectsofthequeryresult.
*/
publiclongcountCriteriaResult(Page<T>page,Criteriac);
/**
*Saveentitiesinbatch
*@paramentitiesTheobjectstobesaved
*@parambatchSizeThenumberofeverysessionflush
*@returnSuccessfulsavecount
*/
publicintbatchSave(List<T>entities,intbatchSize);
/**
*Updateentitiesinbatch
*@paramentitiesTheobjectstobeupdated
*@parambatchSizeThenumberofeverysessionflush
*@returnSuccessfulupdatecount
*/
publicintbatchUpdate(List<T>entities,intbatchSize);
/**
*Saveorupdateentitiesinbatch
*@paramentitiesTheobjectstobesavedorupdated
*@parambatchSizeThenumberofeverysessionflush
*@returnSuccessfulsavecountorupdatecount
*/
publicintbatchSaveOrUpdate(List<T>entities,intbatchSize);
/**
*Updateentities(not-nullproperty)inbatch
*@paramentitiesTheobjectstobeupdated
*@parambatchSizeThenumberofeverysessionflush
*@returnSuccessfulupdatecount
*/
publicintbatchUpdateSelective(List<T>entities,intbatchSize);
/**
*Mergeentitiesinbatch
*@paramentitiesTheobjectstobemerged
*@parambatchSizeThenumberofeverysessionflush
*@returnSuccessfulmergecount
*/
publicintbatchMerge(List<T>entities,intbatchSize);
/**
*Deleteentitiesinbatch
*@paramentitiesTheobjectstobedeleted
*@parambatchSizeThenumberofeverysessionflush
*@returnsuccessfuldeletecount
*/
publicintbatchDelete(List<T>entities,intbatchSize);
}
importjava.io.Serializable;
importjava.lang.reflect.Field;
importjava.lang.reflect.ParameterizedType;
importjava.util.ArrayList;
importjava.util.List;
importorg.apache.commons.lang.StringUtils;
importorg.hibernate.Criteria;
importorg.hibernate.HibernateException;
importorg.hibernate.Query;
importorg.hibernate.SQLQuery;
importorg.hibernate.Session;
importorg.hibernate.SessionFactory;
importorg.hibernate.criterion.CriteriaSpecification;
importorg.hibernate.criterion.Criterion;
importorg.hibernate.criterion.Order;
importorg.hibernate.criterion.Projection;
importorg.hibernate.criterion.Projections;
importorg.hibernate.criterion.Restrictions;
importorg.hibernate.impl.CriteriaImpl;
importorg.hibernate.impl.CriteriaImpl.OrderEntry;
importorg.hibernate.transform.ResultTransformer;
importorg.slf4j.Logger;
importorg.slf4j.LoggerFactory;
importorg.springframework.util.Assert;
importorg.springframework.util.ReflectionUtils;
importcom.alan.mvnapp.mvn_app.dao.GenericDaoIf;
importcom.alan.mvnapp.mvn_app.dao.Page;
/**
*
*HibernateGenericDAOImplementation
*
*@param<T>Entity
*@param<PK>PrimaryKey
*/
publicclassGenericDaoImpl<T,PKextendsSerializable>implementsGenericDaoIf<T,PK>{
protectedLoggerlogger=LoggerFactory.getLogger(getClass());
protectedSessionFactorysessionFactory;
protectedClass<?>entityClass;
publicGenericDaoImpl(){
this.entityClass=(Class<?>)((ParameterizedType)getClass()
.getGenericSuperclass()).getActualTypeArguments()[0];
}
publicGenericDaoImpl(SessionFactorysessionFactory,Class<T>entityClass){
this.sessionFactory=sessionFactory;
this.entityClass=entityClass;
}
@SuppressWarnings("unchecked")
publicTget(finalPKid){
return(T)sessionFactory.getCurrentSession().get(entityClass,id);
}
@SuppressWarnings("unchecked")
publicTload(finalPKid){
return(T)sessionFactory.getCurrentSession().load(entityClass,id);
}
publicvoidevict(Tentity){
sessionFactory.getCurrentSession().evict(entity);
}
@SuppressWarnings("unchecked")
publicPKsave(Tentity){
Assert.notNull(entity);
PKpk=(PK)sessionFactory.getCurrentSession().save(entity);
logger.info("saveentity:{}",entity);
returnpk;
}
publicvoidupdate(Tentity){
Assert.notNull(entity);
sessionFactory.getCurrentSession().update(entity);
logger.info("updateentity:{}",entity);
}
publicvoidsaveOrUpdate(Tentity){
Assert.notNull(entity);
sessionFactory.getCurrentSession().saveOrUpdate(entity);
logger.info("saveorupdateentity:{}",entity);
}
publicvoidupdateSelective(Tentity){
Assert.notNull(entity);
Field[]fields=entity.getClass().getDeclaredFields();
List<String>params=newArrayList<String>();
List<Object>values=newArrayList<Object>();
for(Fieldfield:fields){
StringfieldName=field.getName();
field.setAccessible(true);
Objectvalue=ReflectionUtils.getField(field,entity);
if(value!=null){
params.add(fieldName);
values.add(value);
}
}
if(!params.isEmpty()){
StringBuffersb=newStringBuffer("update"
+entityClass.getSimpleName()+"set");
for(inti=0;i<params.size();i++){
sb.append(params.get(i)+"=?");
if(i<params.size()-1){
sb.append(",");
}
}
FieldpkField=ReflectionUtils.findField(entityClass,"id");
Assert.notNull(pkField);
pkField.setAccessible(true);
sb.append("whereid=?");
values.add(ReflectionUtils.getField(pkField,entity));
createQuery(sb.toString(),values.toArray()).executeUpdate();
logger.info("updateentityselecitive:{}"+entity);
}
}
@SuppressWarnings("unchecked")
publicTmerge(Tentity){
Assert.notNull(entity);
Tt=(T)sessionFactory.getCurrentSession().merge(entity);
logger.info("mergeentity:{}",entity);
returnt;
}
publicvoiddelete(Tentity){
Assert.notNull(entity);
sessionFactory.getCurrentSession().delete(entity);
logger.info("deleteentity:{}",entity);
}
publicvoiddelete(PKid){
Assert.notNull(id);
delete(get(id));
}
publicList<T>findAll(){
returnfindByCriteria();
}
publicPage<T>findAll(Page<T>page){
returnfindByCriteria(page);
}
@SuppressWarnings("unchecked")
publicList<T>find(Stringhql,Object...values){
return(List<T>)createQuery(hql,values).list();
}
@SuppressWarnings("unchecked")
publicList<T>findBySql(Stringsql,Object...values){
return(List<T>)createSQLQuery(sql,values).addEntity(entityClass).list();
}
@SuppressWarnings("unchecked")
publicPage<T>find(Page<T>page,Object...values){
Assert.notNull(page);
if(page.isAutoCount()){
page.setTotalCount(countQueryResult(hql,values));
}
Queryq=createQuery(hql,values);
if(page.isFirstSetted()){
q.setFirstResult(page.getFirst());
}
if(page.isPageSizeSetted()){
q.setMaxResults(page.getPageSize());
}
page.setResult((List<T>)q.list());
returnpage;
}
@SuppressWarnings("unchecked")
publicPage<T>findBySql(Page<T>page,Object...values){
Assert.notNull(page);
if(page.isAutoCount()){
page.setTotalCount(countSQLQueryResult(sql,values));
}
SQLQueryq=createSQLQuery(sql,values);
if(page.isFirstSetted()){
q.setFirstResult(page.getFirst());
}
if(page.isPageSizeSetted()){
q.setMaxResults(page.getPageSize());
}
page.setResult((List<T>)q.addEntity(entityClass).list());
returnpage;
}
publicObjectfindUnique(Stringhql,Object...values){
returncreateQuery(hql,values).uniqueResult();
}
publicObjectfindUniqueBySql(Stringsql,Object...values){
returncreateSQLQuery(sql,values).addEntity(entityClass).uniqueResult();
}
@SuppressWarnings("unchecked")
publicList<T>findByCriteria(Criterion...criterion){
return(List<T>)createCriteria(criterion).list();
}
@SuppressWarnings("unchecked")
publicPage<T>findByCriteria(Page<T>page,Criterion...criterion){
Assert.notNull(page);
Criteriac=createCriteria(criterion);
if(page.isAutoCount()){
page.setTotalCount(countCriteriaResult(page,c));
}
if(page.isFirstSetted()){
c.setFirstResult(page.getFirst());
}
if(page.isPageSizeSetted()){
c.setMaxResults(page.getPageSize());
}
if(page.isOrderBySetted()){
if(page.getOrder().toUpperCase().equals("AES")){
c.addOrder(Order.asc(page.getOrderBy()));
}else{
c.addOrder(Order.desc(page.getOrderBy()));
}
}
page.setResult((List<T>)c.list());
returnpage;
}
@SuppressWarnings("unchecked")
publicList<T>findByProperty(StringpropertyName,Objectvalue){
Assert.hasText(propertyName);
return(List<T>)createCriteria(Restrictions.eq(propertyName,value)).list();
}
@SuppressWarnings("unchecked")
publicTfindUniqueByProperty(StringpropertyName,Objectvalue){
Assert.hasText(propertyName);
return(T)createCriteria(Restrictions.eq(propertyName,value)).uniqueResult();
}
publicbooleanisPropertyUnique(StringpropertyName,ObjectnewValue){
if(newValue==null)returnfalse;
try{
Objectobj=findUniqueByProperty(propertyName,newValue);
returnobj==null;
}catch(HibernateExceptione){
returnfalse;
}
}
publicQuerycreateQuery(StringqueryString,Object...values){
Assert.hasText(queryString);
QueryqueryObject=sessionFactory.getCurrentSession().createQuery(queryString);
if(values!=null){
for(inti=0;i<values.length;i++){
queryObject.setParameter(i,values[i]);
}
}
returnqueryObject;
}
publicSQLQuerycreateSQLQuery(StringqueryString,Object...values){
Assert.hasText(queryString);
SQLQueryqueryObject=sessionFactory.getCurrentSession().createSQLQuery(queryString);
if(values!=null){
for(inti=0;i<values.length;i++){
queryObject.setParameter(i,values[i]);
}
}
returnqueryObject;
}
publicCriteriacreateCriteria(Criterion...criterions){
Criteriacriteria=sessionFactory.getCurrentSession().createCriteria(entityClass);
for(Criterionc:criterions){
criteria.add(c);
}
returncriteria;
}
publiclongcountQueryResult(Stringhql,Object...values){
hql=hql.replaceAll("[Ff][Rr][Oo][Mm]","from");
Stringstr=hql.toLowerCase();
if(!StringUtils.contains(str,"groupby")
&&!StringUtils.contains(str,"union")
&&!StringUtils.contains(str,"minus")
&&!StringUtils.contains(str,"intersect")
&&!StringUtils.contains(StringUtils.substringAfter(str,"from"),"(")
){
str="selectcount(*)from"+StringUtils.substringAfter(hql,"from");
return((Number)createQuery(hql,values).iterate().next()).longValue();
}else{
thrownewHibernateException("notsupportthisHQL:"+hql);
}
}
publiclongcountSQLQueryResult(Stringsql,Object...values){
Stringstr=sql.toLowerCase();
StringbeforeFrom=StringUtils.substringBefore(str,"from");
if(StringUtils.countMatches(beforeFrom,"(")
!=StringUtils.countMatches(beforeFrom,")")
||StringUtils.contains(str,"groupby")
||StringUtils.contains(str,"union")
||StringUtils.contains(str,"minus")
||StringUtils.contains(str,"intersect")){
str="selectcount(*)from("+sql+")astmp";
}else{
str="selectcount(*)from"+
StringUtils.substringAfter(str,"from");
}
Objectret=createSQLQuery(str,values).uniqueResult();
return(ret==null?0:((Number)ret).longValue());
}
@SuppressWarnings("unchecked")
publiclongcountCriteriaResult(Page<T>page,Criteriac){
CriteriaImplcimpl=(CriteriaImpl)c;
//FirstProjection,ResultTransformer,OrderByout,EmptyafterathreeCountoperations
Projectionprojection=cimpl.getProjection();
ResultTransformertransformer=cimpl.getResultTransformer();
List<CriteriaImpl.OrderEntry>orderEntries=null;
try{
FieldorderEntriesField=cimpl.getClass().getDeclaredField("orderEntries");
orderEntriesField.setAccessible(true);
orderEntries=(List<OrderEntry>)ReflectionUtils.getField(
orderEntriesField,cimpl);
ReflectionUtils.setField(
orderEntriesField,cimpl,
newArrayList<OrderEntry>());
}catch(Exceptione){
logger.error("Notmaythrowanexception:{}",e.getMessage());
}
//DoCountquery
longtotalCount=(Long)c.setProjection(Projections.rowCount())
.uniqueResult();
if(totalCount<1)
return-1;
//WilltheProjectionandOrderBybeforeconditionsbacktogoback
c.setProjection(projection);
if(projection==null){
c.setResultTransformer(CriteriaSpecification.ROOT_ENTITY);
}
if(transformer!=null){
c.setResultTransformer(transformer);
}
try{
FieldorderEntriesField=cimpl.getClass().getDeclaredField("orderEntries");
orderEntriesField.setAccessible(true);
ReflectionUtils.setField(orderEntriesField,orderEntries);
}catch(Exceptione){
logger.error("Notmaythrowanexception:{}",e.getMessage());
}
returntotalCount;
}
privateinttuneBatchSize(intbatchSize){
if(batchSize<20){
batchSize=20;
}elseif(batchSize>200){
batchSize=200;
}
returnbatchSize;
}
publicintbatchSave(List<T>entities,intbatchSize){
Assert.notEmpty(entities);
batchSize=tuneBatchSize(batchSize);
intcount=0;
Sessionsession=sessionFactory.getCurrentSession();
for(inti=0;i<entities.size();i++){
session.save(entities.get(i));
if(i%batchSize==0||i==entities.size()-1){
session.flush();
session.clear();
}
count++;
}
returncount;
}
publicintbatchUpdate(List<T>entities,intbatchSize){
Assert.notEmpty(entities);
batchSize=tuneBatchSize(batchSize);
intcount=0;
Sessionsession=sessionFactory.getCurrentSession();
for(inti=0;i<entities.size();i++){
session.update(entities.get(i));
if(i%batchSize==0||i==entities.size()-1){
session.flush();
session.clear();
}
count++;
}
returncount;
}
publicintbatchSaveOrUpdate(List<T>entities,intbatchSize){
Assert.notEmpty(entities);
batchSize=tuneBatchSize(batchSize);
intcount=0;
Sessionsession=sessionFactory.getCurrentSession();
for(inti=0;i<entities.size();i++){
session.saveOrUpdate(entities.get(i));
if(i%batchSize==0||i==entities.size()-1){
session.flush();
session.clear();
}
count++;
}
returncount;
}
publicintbatchUpdateSelective(List<T>entities,intbatchSize){
Assert.notEmpty(entities);
batchSize=tuneBatchSize(batchSize);
intcount=0;
Sessionsession=sessionFactory.getCurrentSession();
for(inti=0;i<entities.size();i++){
updateSelective(entities.get(i));
if(i%batchSize==0||i==entities.size()-1){
session.flush();
session.clear();
}
count++;
}
returncount;
}
publicintbatchMerge(List<T>entities,intbatchSize){
Assert.notEmpty(entities);
batchSize=tuneBatchSize(batchSize);
intcount=0;
Sessionsession=sessionFactory.getCurrentSession();
for(inti=0;i<entities.size();i++){
session.merge(entities.get(i));
if(i%batchSize==0||i==entities.size()-1){
session.flush();
session.clear();
}
count++;
}
returncount;
}
publicintbatchDelete(List<T>entities,intbatchSize){
Assert.notEmpty(entities);
batchSize=tuneBatchSize(batchSize);
intcount=0;
Sessionsession=sessionFactory.getCurrentSession();
for(inti=0;i<entities.size();i++){
session.delete(entities.get(i));
if(i%batchSize==0||i==entities.size()-1){
session.flush();
session.clear();
}
count++;
}
returncount;
}
}
以上是脚本之家(jb51.cc)为你收集整理的全部代码内容,希望文章能够帮你解决所遇到的程序开发问题。 如果觉得脚本之家网站内容还不错,欢迎将脚本之家网站推荐给程序员好友。 (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
