Configuration file: Spring-jpa.xml
<?xml version= "1.0" encoding= "UTF-8"?> <beans "xmlns=" xmlns: Xsi= "Http://www.w3.org/2001/XMLSchema-instance" xmlns:p= "http://www.springframework.org/schema/p" xmlns:c= "http ://www.springframework.org/schema/c "xmlns:util=" Http://www.springframework.org/schema/util "xmlns:aop=" http:// Www.springframework.org/schema/aop "xmlns:tx=" Http://www.springframework.org/schema/tx "xmlns:jpa=" http:// WWW.SPRINGFRAMEWORK.ORG/SCHEMA/DATA/JPA "xsi:schemalocation=" Http://www.springframework.org/schema/beans http:// Www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/util http:// Www.springframework.org/schema/util/spring-util-3.1.xsd http://www.springframework.org/schema/tx http:// Www.springframework.org/schema/tx/spring-tx-3.1.xsd HTTP://WWW.SPRINGFRAMEWORK.ORG/SCHEMA/DATA/JPA http:// Www.springframework.org/schema/data/jpa/spring-jpa.xsd HTTP://WWW.SPRINGFRAMEWORK.ORG/SCHEMA/AOP http:// Www.sprinGframework.org/schema/aop/spring-aop-3.1.xsd "> <!--BONECP tutorial See http://www.cnblogs.com/zhwl/archive/2013/07/ 23/3208550.html--> <!--JPA Entity Manager factory--> <bean id= "Entitymanagerfactory" class= . JPA. Localcontainerentitymanagerfactorybean "> <property name=" dataSource "ref=" ${springjpa.datasource} "/> < Property Name= "Persistenceprovider" ref= "Persistenceprovider"/> <property name= "Jpavendoradapter" Jpavendoradapter "/> <property name=" Jpadialect "ref=" Jpadialect "/> <property name=" PackagesToScan "value = "${springjpa.packagestoscan}"/> <property name= "jpaproperties" > <props> <prop key= "hibernate. Dialect ">org.hibernate.dialect.Oracle9Dialect</prop> <prop key=" Hibernate.connection.driver_class " >oracle.jdbc.OracleDriver</prop> <prop key= "hibernate.max_fetch_depth" >3</prop> <prop key=
"Hibernate.jdbc.fetch_size" >18</prop> <prop key= "Hibernate.jdbc.batch_size" >10</prop> <prop key= "Hibernate.hbm2ddl.auto" >${SPRINGJPA. jpaproperties.hibernate.hbm2ddl.auto}</prop> <prop key= "Hibernate.show_sql" >false</prop> <PR Op key= "Hibernate.format_sql" >false</prop> <prop key= "Javax.persistence.validation.mode" >none</ Prop> <!--query caching--> <prop key= "Hibernate.cache.use_query_cache" >true</prop> <prop key = "Hibernate.cache.region.factory_class" >org.hibernate.cache.ehcache.EhCacheRegionFactory</prop> <!- -If all, the default all open level two cache, the entity on the @cacheable do not have to play--> <prop key= "Javax.persistence.sharedCache.mode" >enable_ selective</prop> <prop key= "Hibernate.generate_statistics" >true</prop> </props> </prop Erty> </bean> <!--for specifying the persistence implementation Vendor class--> <bean id= "Persistenceprovider" class= Atepersistence "/> <!--is used to set the specific attributes of the JPA implementation vendor--> <bean id= "Jpavendoradapter" class= "Org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" > <
The property name= "database" value= "${springjpa.jpavendoradapter.database}"/> </bean> <!--is used to specify some advanced features--> <bean id= "Jpadialect" class= "Org.springframework.orm.jpa.vendor.HibernateJpaDialect"/> <!--transaction manager--> & Lt;bean id= "TransactionManager" class= "Org.springframework.orm.jpa.JpaTransactionManager" > <property name= " Entitymanagerfactory "ref=" entitymanagerfactory/> </bean> <!--enable annotation transactions--> N-driven/> <!--Configure the spring Data JPA Scan directory--> <jpa:repositories base-package= "Com.wonders.**.dao" Entity-mana ger-factory-ref= "Entitymanagerfactory" transaction-manager-ref= "TransactionManager" repository-impl-postfix= " Impl "factory-class=" Com.wonders.frame.core.dao.DefaultRepositoryFactoryBean "> </jpa:repositories> </
Beans>
Factory Bean:defaultrepositoryfactorybean
/**
* * * * * *
package Com.wonders.frame.core.dao;
Import java.io.Serializable;
Import Javax.persistence.EntityManager;
Import org.springframework.data.jpa.repository.JpaRepository;
Import Org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean;
Import Org.springframework.data.repository.core.support.RepositoryFactorySupport;
/**
*
*
*
/public class Defaultrepositoryfactorybean<t extends Jparepository<s, Id>, S, ID extends serializable>
extends Jparepositoryfactorybean<t, S, id> {
/**
* Returns a {@link Repositoryfactorysupport}.
* *
@param entitymanager
* @return
/
protected Repositoryfactorysupport Createrepositoryfactory (Entitymanager entitymanager) {return
new defaultrepositoryfactory (Entitymanager);
}
}
Factory Category: Defaultrepositoryfactory
Package Com.wonders.frame.core.dao;
Import java.io.Serializable;
Import Javax.persistence.EntityManager;
Import Org.springframework.data.jpa.repository.JpaRepository;
Import org.springframework.data.jpa.repository.support.JpaEntityInformation;
Import Org.springframework.data.jpa.repository.support.JpaRepositoryFactory;
Import Org.springframework.data.querydsl.QueryDslPredicateExecutor;
Import Org.springframework.data.querydsl.QueryDslUtils;
Import Org.springframework.data.repository.core.RepositoryMetadata;
Import Org.springframework.util.Assert;
Import Com.wonders.frame.core.dao.impl.GenericRepositoryImpl; /** * * */public class Defaultrepositoryfactory extends Jparepositoryfactory {private final Entitymanager Entityma
Nager;
Public defaultrepositoryfactory (Entitymanager Entitymanager) {super (Entitymanager);
Assert.notnull (Entitymanager);
This.entitymanager = Entitymanager; @Override protected <t, ID extends serializable> jparepository<?,? &Gt Gettargetrepository (Repositorymetadata metadata, Entitymanager entitymanager) {//todo jpaentityinformation<?, Ser
ializable> entityinformation = getentityinformation (Metadata.getdomainclass ()); return new Genericrepositoryimpl (Entityinformation, Entitymanager); Custom Implementation} @Override protected class<?> getrepositorybaseclass (Repositorymetadata Metada
TA) {return genericrepositoryimpl.class; }
}
Custom Extension Interface: Genericrepository
Package Com.wonders.frame.core.dao;
Import java.io.Serializable;
Import Java.util.HashMap;
Import Java.util.LinkedHashMap;
Import java.util.List;
Import Javax.persistence.Query;
Import org.springframework.data.domain.Pageable;
Import Org.springframework.data.jpa.repository.JpaRepository;
Import Org.springframework.data.jpa.repository.JpaSpecificationExecutor;
Import Org.springframework.data.repository.CrudRepository;
Import Org.springframework.data.repository.NoRepositoryBean;
Import org.springframework.transaction.annotation.Transactional;
Import Com.wonders.frame.core.model.vo.SimplePage; /** * * @NoRepositoryBean is required for the interface {@link jparepository} provided by spring data JPA * @NoRepositoryBean public in Terface genericrepository<t, ID extends serializable> extends Jparepository<t, Id> jpaspecificationexecutor<t> {list<t> findall (hashmap<string,object> queryParams, LINKEDHASHMAP&L T
String, string> by); Simplepage<t> FIndbypage (hashmap<string,object> queryparams, linkedhashmap<string, string> by, Integer PageSize,
Integer pagenum); simplepage<t> findbypagewithsql (String sql, hashmap<string, object> queryparams, Integer pageSize, Integ
Er pagenum); Simplepage<t> findbypagewithwherehql (String wherehql, hashmap<string, object> queryParams, Integer
PageSize, Integer pagenum); Simplepage<t> findbypage (hashmap<string, object> queryparams, String by, Integer pageSize, integer pag
ENum); /** * * Based on SQL statement query, the result is a collection of entities * * @param SQL * * * @param entityclass * * * @return * * * Public LIST<T&G T
Findallbysql (class<t> entityclass, String sql);
public string Getuniqueresultbysql (string sql,hashmap<string,object> queryparams);
Public list<t> findbyattachids (string[] IDs);
@Transactional//public void Updatemodelnameandmodelid (String modelname, Integer modelid, string[] IDs);
}
Custom extension Implementation class: Genericrepositoryimpl, where the other methods are global shared methods, that is, each user interface that inherits the custom extension interface can use these functions
Package Com.wonders.frame.core.dao.impl;
Import java.io.Serializable;
Import Java.util.HashMap;
Import Java.util.LinkedHashMap;
Import java.util.List;
Import Javax.persistence.EntityManager;
Import Javax.persistence.Query;
Import Org.apache.log4j.Logger;
Import org.springframework.data.jpa.repository.support.JpaEntityInformation;
Import Org.springframework.data.jpa.repository.support.JpaEntityInformationSupport;
Import Org.springframework.data.jpa.repository.support.SimpleJpaRepository;
Import Org.springframework.data.repository.NoRepositoryBean;
Import Org.springframework.data.repository.query.Param;
Import org.springframework.transaction.annotation.Transactional;
Import Com.wonders.frame.core.dao.GenericRepository;
Import Com.wonders.frame.core.model.vo.PageInfo;
Import Com.wonders.frame.core.model.vo.SimplePage;
Import Com.wonders.frame.core.utils.ReflectUtil;
/** * {@link Genericrepository} Interface implementation class and expands on {@link simplejparepository}. * @param <T> Orm Object * @param <id&Gt Primary KEY ID */@NoRepositoryBean//Required public class Genericrepositoryimpl<t, ID extends serializable> extends simple Jparepository<t, Id> implements Genericrepository<t, id> {static Logger Logger = Logger.getlogger (genericre
Positoryimpl.class);
Private final Entitymanager em;
Private final class<t> Entityclass;
Private final String EntityName; /** * constructor * @param domainclass * @param em/public Genericrepositoryimpl (final JPAENTITYINFORMATION&L T
T,?> entityinformation, Entitymanager Entitymanager) {super (entityinformation, Entitymanager);
This.em = Entitymanager;
This.entityclass=entityinformation.getjavatype ();
This.entityname=entityinformation.getentityname (); }/** * constructor * @param domainclass * @param em/public Genericrepositoryimpl (class<t> DomainClass, Enti
Tymanager em) {This (Jpaentityinformationsupport.getmetadata (DomainClass, EM), EM); } @Override PubliC list<t> FindAll (hashmap<string,object> queryparams, linkedhashmap<string, String> by) {
String wherehql=buildwherequery (Queryparams);
String Orderhql=buildorderby (by);
String hql = "Select O from" +entityname+ "O where o.removed=0";
Query query=createquery (Hql+wherehql+orderhql,queryparams);
List<t> list= (list<t>) query.getresultlist ();
return list; @Override public simplepage<t> findbypage (hashmap<string,object> queryparams, LINKEDHASHMAP&L T String, string> by, Integer Pagesize,integer pagenum) {return findbypage Queryparams,buildorderby (orde
Rby), pageSize, pagenum); @Override public simplepage<t> findbypage (hashmap<string,object> queryparams, String by, Int
Eger Pagesize,integer pagenum) {String wherehql=buildwherequery (queryparams);
String Orderhql=orderby; String hql= "SELECT COUNT (*) from" + EntitYname+ "O where o.removed=0";
Query query=createquery (Hql+wherehql+orderhql,queryparams);
PageInfo pageinfo=new PageInfo (((Long) Query.getsingleresult ()). Intvalue (), pageSize);
Pageinfo.refresh (Pagenum);
HQL = "Select O from" + entityname+ "O where o.removed=0";
Query=createquery (Hql+wherehql+orderhql,queryparams);
Query.setfirstresult (Pageinfo.getstartrecord ()). Setmaxresults (Pageinfo.getpagesize ());
return new Simplepage<t> (Pageinfo,query.getresultlist ()); Private Query createquery (String hql,hashmap<string,object> queryparams) {Query query = Em.createque
Ry (HQL);
Setqueryparams (query, queryparams);
return query; @Override public simplepage<t> findbypagewithwherehql (String wherehql, hashmap<string,object> Queryparams, Integer Pagesize,integer pagenum) {String hql= "SELECT COUNT (*) from" + entityname+ "O where o.re
Moved=0 ";
if (wherehql==null) {wherehql= "";
} Query query = em.createquery (HQL+WHEREHQL);
Setqueryparams (query, queryparams);
PageInfo pageinfo=new PageInfo (((Long) Query.getsingleresult ()). Intvalue (), pageSize);
Pageinfo.refresh (Pagenum);
HQL = "Select O from" + entityname+ "O where o.removed=0";
query = Em.createquery (HQL+WHEREHQL);
Setqueryparams (query, queryparams);
Query.setfirstresult (Pageinfo.getstartrecord ()). Setmaxresults (Pageinfo.getpagesize ());
return new Simplepage<t> (Pageinfo,query.getresultlist ()); @Override public simplepage<t> findbypagewithsql (String sql, hashmap<string,object> queryparams, Integer
Pagesize,integer pagenum) {Query query = em.createnativequery ("SELECT count (*) from (" +sql+ ")");
Setqueryparams (query, queryparams);
PageInfo pageinfo=new PageInfo (((Long) Query.getsingleresult ()). Intvalue (), pageSize);
Pageinfo.refresh (Pagenum);
query = em.createnativequery (SQL); Setqueryparams (query, queryParams);
Query.setfirstresult (Pageinfo.getstartrecord ()). Setmaxresults (Pageinfo.getpagesize ());
return new Simplepage<t> (Pageinfo,query.getresultlist ()); } private void Setqueryparams (query query, hashmap<string, object> queryparams) {if (Queryparams!=null && ; Queryparams.size () >0) {for (String Key:queryParams.keySet ()) {Class Clazz=reflectutil.getfieldtype (THIS.ENTITYC
Lass, Key.replaceall ("_s", ""). ReplaceAll ("_e", ""). ReplaceAll ("_in", "")); if (Clazz!=null && clazz.equals (string.class) &&!key.endswith ("_in")) {Query.setparameter (key, '% ' +q
Ueryparams.get (Key). toString () + '% ');
}else{Query.setparameter (Key, Queryparams.get (key)); '}} ' private String Buildorderby (linkedhashmap<string, string> by) {//TODO auto-generated Metho
D stub stringbuffer orderbyql = new StringBuffer ("");
if (Orderby!=null && orderby.size () >0) {Orderbyql.append ("Order by"); for (String Key:orderby.keySet ()) {orderbyql.append ("O.").
Append (Key). Append (""). Append (Orderby.get (key)). Append (",");
} Orderbyql.deletecharat (Orderbyql.length ()-1);
return orderbyql.tostring (); Private String Buildwherequery (hashmap<string, object> queryparams) {//TODO auto-generated method stub St
Ringbuffer wherequeryhql = new StringBuffer (""); if (Queryparams!=null && queryparams.size () >0) {for (String Key:queryParams.keySet ()) {//if (Key.equalsig Norecase ("id")) {//Wherequeryhql.append ("and"). Append ("O.").
Append (Key). Append ("In (:"). Append (Key). Append (")"); }else if (Key.endswith ("_s")) {Wherequeryhql.append ("and"). Append ("O.").
Append (Key.replace ("_s", "")). Append (">=:"). Append (key); }else if (Key.endswith ("_e")) {Wherequeryhql.append ("and"). Append ("O.").
Append (Key.replace ("_e", "")). Append ("<=:"). Append (key); }else if (Key.endswith ("_in")) {Wherequeryhql.append ("and"). Append ("O."). Append (Key.replace ("_in", "")). Append ("in:"). Append (key);
}else{Class Clazz=reflectutil.getfieldtype (This.entityclass, key); if (Clazz!=null && clazz.equals (string.class)) {Wherequeryhql.append ("and"). Append ("O.").
Append (Key). Append ("like:"). Append (key); }else{wherequeryhql.append ("and"). Append ("O.").
Append (Key). Append ("=:"). Append (key);
}}} return Wherequeryhql.tostring (); @Override public list<t> findallbysql (class<t> entityclass, String sql) {//Create native SQL query instance, specify
The returned entity type query query = em.createnativequery (Sql,entityclass);
Executes the query, returns the list of entities, list<t> entitylist = Query.getresultlist ();
return entitylist; public string Getuniqueresultbysql (string sql,hashmap<string,object> queryparams) {Query query = Em.createnat
Ivequery (SQL);
For (String Key:queryParams.keySet ()) {Query.setparameter (key, Queryparams.get (key));
} Executes the query, returning the list of entities, string result = (string) query.getsingleresult ();
return result; }//Public list<t> findbyattachids (string[] IDs) {//String idsstring = "";//if (Ids==null | | ids.length<1) r
Eturn null; for (int i=0; i<ids.length; i++) {//try {//long.valueof (Ids[i]);//} catch (NumberFormatException e) {//
return null;
}//idsstring + + ids[i] + ",";
}//idsstring = Idsstring.substring (0,idsstring.length ()-1);
String hql = "from Attach t where t.removed= ' 0 ' and t.id in (" +idsstring+ ")";
Query query=createquery (HQL, NULL);
List<t> list= (list<t>) query.getresultlist ();
return list; ////@Transactional//public void Updatemodelnameandmodelid (String modelname, Integer modelid, string[] IDs) {//
String idsstring = "";
if (Ids==null | | ids.length<1) return; for (int i=0; i<ids.length; i++) {//try {//long.valueof (Ids[i]);//} catch (NumberFormatException e) {// Return;
}//idsstring + + ids[i] + ",";
}//idsstring = Idsstring.substring (0,idsstring.length ()-1);
String hql = "Update Attach a set a.modelname =" +modelname+ ", A.modelid =" +modelid+ "where a.ID in (" +idsstring+ ")";
CreateQuery (HQL, null). Executeupdate (); // }
}
Usage Example: Customizing interface Inheritance Extension interface
Package Com.wonders.frame.cpq.dao;
Import java.util.List;
Import Javax.persistence.QueryHint;
Import Org.springframework.data.domain.Page;
Import org.springframework.data.domain.Pageable;
Import org.springframework.data.jpa.repository.Modifying;
Import Org.springframework.data.jpa.repository.Query;
Import org.springframework.data.jpa.repository.QueryHints;
Import Org.springframework.data.repository.query.Param;
Import org.springframework.transaction.annotation.Transactional;
Import Com.wonders.frame.core.dao.GenericRepository;
Import Com.wonders.frame.cpq.model.bo.CpqMain; Public interface Cpqmaindao extends Genericrepository<cpqmain, integer>{public page<cpqmain> findall (
Pageable pageable);
@Query ("Select a from Cpqmain a where a.removed = 0 and a.id =?")
Public Cpqmain FindByID (Integer ID); @Transactional @Modifying @Query ("Update Cpqmain a set a.removed = 1 where a.id =:id") Public Integer Removebyid (@Pa
RAM ("id") Integer ID); @QueryHints ({@qUeryhint (name = "Org.hibernate.cacheable", value = "true")}) public list<cpqmain> findall ();
}