继承jparepository 查询的接口怎么注入

文章数:168
评论数:424
访问量:667192
注册日期:
阅读量:5863
阅读量:12276
阅读量:381318
阅读量:1073389
51CTO推荐博文
一、maven配置文件加入依赖Spring Data JPA 依赖,最新稳定的版本为1.10.1.RELEASE,这里需要说明下的是,其依然依赖hibernate JPA相关JAR,hibernate-core之类的是不需要的。hibernate是JPA规范的一种实现,所以需要加入其依赖。ehcache是hibernate二级缓存的配置,不是必须的。&dependency&
&&&&&&&&&groupId&org.springframework.data&/groupId&
&&&&&&&&&artifactId&spring-data-jpa&/artifactId&
&&&&&&&&&version&1.10.1.RELEASE&/version&
&/dependency&
&dependency&
&&&&&groupId&org.hibernate&/groupId&
&&&&&artifactId&hibernate-ehcache&/artifactId&
&&&&&version&5.1.0.Final&/version&
&/dependency&
&dependency&
&&&&&groupId&org.hibernate&/groupId&
&artifactId&hibernate-validator&/artifactId&
&version&5.2.4.Final&/version&
&/dependency&
&dependency&
&groupId&org.hibernate&/groupId&
&artifactId&hibernate-entitymanager&/artifactId&
&version&5.1.0.Final&/version&
&/dependency&二、声明持久层接口这里给大家说说几个常见的很重要的核心类文件,源码下面也贴上了。大家可以看到这个类的继承结构,这里值得说的是,Spring Data JPA的持久层的借口命名是有一套规范的,后面你加入的自定义方法满足其规范之后,你的实现类都是可以不需要写的,而且事务管理也帮你做好了。是不是觉得很神奇呢!JpaRepository继承了PagingAndSortingRepository、QueryByExampleExecutor,PagingAndSortingRepository又继承了CrudRepository,CrudRepository&大家通过看名字也应该是干啥的,其就是CRUD的,PagingAndSortingRepository里面加了分页的相关方法。
CrudRepository.java
package&org.springframework.data.
import&java.io.S
@NoRepositoryBean
public&interface&CrudRepository&T,&ID&extends&Serializable&&extends&Repository&T,&ID&&{
&S&extends&T&&S&save(S&entity);
&S&extends&T&&Iterable&S&&save(Iterable&S&&entities);
T&findOne(ID&id);
boolean&exists(ID&id);
Iterable&T&&findAll();
Iterable&T&&findAll(Iterable&ID&&ids);
long&count();
void&delete(ID&id);
void&delete(T&entity);
void&delete(Iterable&?&extends&T&&entities);
void&deleteAll();
Repository.java&是一个空的接口
package&org.springframework.data.
import&java.io.S
public&interface&Repository&T,&ID&extends&Serializable&&{
大伙可以看看其源码,源码里面的注释我就不贴出来了,大家看方法名应该就知道其具体的意思了。
package&org.springframework.data.jpa.
import&java.io.S
import&java.util.L
import&javax.persistence.EntityM
import&org.springframework.data.domain.E
import&org.springframework.data.domain.S
import&org.springframework.data.repository.NoRepositoryB
import&org.springframework.data.repository.PagingAndSortingR
import&org.springframework.data.repository.query.QueryByExampleE
@NoRepositoryBean
public&interface&JpaRepository&T,&ID&extends&Serializable&
extends&PagingAndSortingRepository&T,&ID&,&QueryByExampleExecutor&T&&{
List&T&&findAll();
List&T&&findAll(Sort&sort);
List&T&&findAll(Iterable&ID&&ids);
&S&extends&T&&List&S&&save(Iterable&S&&entities);
void&flush();
&S&extends&T&&S&saveAndFlush(S&entity);
void&deleteInBatch(Iterable&T&&entities);
void&deleteAllInBatch();
T&getOne(ID&id);
&S&extends&T&&List&S&&findAll(Example&S&&example);
&S&extends&T&&List&S&&findAll(Example&S&&example,&Sort&sort);
}大家用maven的时候,可以将源码顺便下下来,myeclipse里面设置一下即可,如图所示:我这里的接口如下:package&com.example.
import&java.util.L
import&org.springframework.data.jpa.repository.JpaR
import&com.example.entity.UserI
public&interface&UserDaoSpringJpa&extends&JpaRepository&UserInfo,String&{
public&List&UserInfo&&findByUsername(String&username);//注意这个命名,Spring会自动根据这个username去数据库里面取值,可以看到后面生成的sql语句,where条件里面就加了&where&user_name&=?,这就是Spring&Data&JPA查询命名的方便之处,只要按规则命名,他会采取一定的策略,通过解析方法名称创建查询,来生成sql语句。
}JpaRepository&UserInfo,String& 这里是泛型接口,UserInfo是我们的实体类,String是主键类型,也称为id,大家以前写hibernatebasedao的时候可能是见过了的。这叫 泛型限定式依赖注入,也是Spring4的一大特性。之前有篇博文也提到了&三、在接口中声明自定义业务方法Spring Data JPA将会根据指定的策略(后续会有文章说明,本此只是简单的介绍下,能跑起来。)为该方法生成实现代码,用户不需要实现该接口,这样就只需要写接口就行了。四、Spring配置文件相关配置配置文件中加入 jpa:repositories,启用扫描并自动创建代理 Spring 初始化容器时将会扫描 base-package 指定的包目录及其子目录,为继承 Repository 或其子接口的接口创建代理对象,并将代理对象注册为 Spring Bean,业务层便可以通过 Spring autowired来直接使用该对象。此需要jpa命名空间:xmlns:jpa="
xsi:schemaLocation="
&&&&&&&http://www.springframework.org/schema/data/jpa&http://www.springframework.org/schema/data/jpa/spring-jpa.xsd
&&&&&&&"具体的配置参加如下:各参数的含义配置文件里面已经给出了详细的解释,同时给出了相关配置类的源码。一些配置的属性,大家在源码里面也是可以找到的。&
&!--&启用扫描并自动创建代理&Spring&初始化容器时将会扫描&base-package&指定的包目录及其子目录,
为继承&Repository&或其子接口的接口创建代理对象,并将代理对象注册为&Spring&Bean,
业务层便可以通过&Spring&autowired来直接使用该对象。&--&
&jpa:repositories&base-package="com.example.service"
&entity-manager-factory-ref="entityManagerFactory"&
&transaction-manager-ref="transactionManager"/&&
&&!--&通过entityManagerFactory的createEntityManager()方法获取EntityManager&--&
&&&&&bean&id="entityManagerFactory"
&&&&&&&&&&class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"&
&&&&&&&&&&&!--&指定数据源&--&
&&&&&&&&&property&name="dataSource"&ref="dataSource"/&
&&&&&&&&&property&name="packagesToScan"&value="com.example"/&
&&&&&&&&&!--&用于指定持久化实现厂商类&--&
&&&&&&&&&property&name="persistenceProvider"&
&&&&&&&&&&&&&bean&class="org.hibernate.jpa.HibernatePersistenceProvider"/&&!--&替换&org.hibernate.ejb.HibernatePersistence&--&
&&&&&&&&&/property&
&&&&&&&&&!--&jpaVendorAdapter&:用于设置实现厂商JPA实现的特定属性,
&&&&&&&& 目前Spring提供了HibernateJpaVendorAdapter、OpenJpaVendorAdapter、EclipseLinkJpaVendorAdapter、
&三个实现。&TopLinkJpaVendorAdapter在Spring4里面已经删除了,
&目前支持的数据库如下:&DB2,&DERBY,&H2,&HSQL,&INFORMIX,&MYSQL,&ORACLE,&POSTGRESQL,&SQL_SERVER,&SYBASE,
&这个类型在Spring提供的枚举类型&Database&里面有详细定义--&
&&&&&&&&&property&name="jpaVendorAdapter"&
&&&&&&&&&&&&&bean&class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"&
&&&&&&&&&&&&&&&&&property&name="generateDdl"&value="false"/&
&&&&&&&&&&&&&&&&&property&name="database"&value="MYSQL"/&
&&&&&&&&&&&&&&&&&property&name="databasePlatform"&value="org.hibernate.dialect.MySQL5InnoDBDialect"/&
&&&&&&&&&&&&&&&&&property&name="showSql"&value="true"/&
&&&&&&&&&&&&&/bean&
&&&&&&&&&/property&
&&&&&&&&&!--&&&&jpaDialect:用于指定一些高级特性,如事务管理,获取具有事务功能的连接对象等,
&&&&&&&&目前Spring提供HibernateJpaDialect、OpenJpaDialect&、EclipseLinkJpaDialect&--&
&&&&&&&&&property&name="jpaDialect"&
&&&&&&&&&&&&&bean&class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"/&
&&&&&&&&&/property&
&&&&&&&&&!--&用于指定JPA属性,跟之前hibernateProperties是一致的&--&
&&&&&&&&&property&name="jpaPropertyMap"&
&&&&&&&&&&&&&map&
&&&&&&&&&&&&&&&&&entry&key="hibernate.dialect"&value="${hibernate.dialect}"/&&
&entry&key="hibernate.show_sql"&value="${hibernate.show_sql}"/&
&entry&key="hibernate.format_sql"&value="false"/&
&entry&key="hibernate.query.substitutions"&value="${hibernate.query.substitutions}"/&
&entry&key="hibernate.default_batch_fetch_size"&value="${hibernate.default_batch_fetch_size}"/&
&entry&key="hibernate.max_fetch_depth"&value="${hibernate.max_fetch_depth}"/&
&entry&key="hibernate.generate_statistics"&value="${hibernate.generate_statistics}"/&
&entry&key="hibernate.bytecode.use_reflection_optimizer"&value="${hibernate.bytecode.use_reflection_optimizer}"/&
&!--&缓存Cache配置&--&
&entry&&key="hibernate.cache.provider_class"&value="${hibernate.cache.provider_class}"/&
&entry&key="hibernate.cache.use_second_level_cache"&value="${hibernate.cache.use_second_level_cache}"/&
&entry&key="hibernate.cache.use_query_cache"&value="${hibernate.cache.use_query_cache}"/&
&entry&key="hibernate.cache.region.factory_class"&value="${hibernate.cache.region.factory_class}"/&
&entry&key="net.sf.ehcache.configurationResourceName"&value="${net.sf.ehcache.configurationResourceName}"/&
&entry&key="hibernate.cache.use_structured_entries"&value="${hibernate.cache.use_structured_entries}"/&
&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&/map&
&&&&&&&&&/property&
&&&&&/bean&
&&&&&!--指定事务管理器--&
&&&&&bean&id="transactionManager"&class="org.springframework.orm.jpa.JpaTransactionManager"&
&&&&&&&&&property&name="entityManagerFactory"&ref="entityManagerFactory"/&
&&&&&/bean&
jpaVendorAdapter 相关参数的设置AbstractJpaVendorAdapter 类里面有详细说明:如下图所示:五、测试package&com.example.
import&java.io.IOE
import&java.util.ArrayL
import&java.util.L
import&java.util.UUID;
import&javax.servlet.http.HttpServletR
import&javax.servlet.http.HttpServletR
import&org.apache.log4j.L
import&org.springframework.beans.factory.annotation.A
import&org.springframework.stereotype.C
import&org.springframework.ui.ModelM
import&org.springframework.web.bind.annotation.RequestM
import&com.example.entity.UserI
import&com.example.service.impl.UserInfoS
import&com.google.gson.G
@Controller
public&class&UserInfoAction&{
@Autowired
private&UserInfoService&userInfoS
private&Logger&log&=&Logger.getLogger(this.getClass());
@RequestMapping("findByUserName.do")
public&void&findByUserName(HttpServletRequest&request,
HttpServletResponse&response,&ModelMap&map)&throws&IOException{
List&UserInfo&&listUserInfo&=&userInfoService.findByUsername("wj");
for(UserInfo&userInfo:listUserInfo){
(userInfo.getUsername()+":"+userInfo.getEmail());
Gson&gson&=&new&Gson();
String&jsonStr&=&gson.toJson(listUserInfo);
response.getWriter().println(jsonStr);
@RequestMapping("saveUser.do")
public&void&saveUser(HttpServletRequest&request,
HttpServletResponse&response,&ModelMap&map)&throws&IOException{
List&UserInfo&&listUserInfo&=&new&ArrayList&UserInfo&();
for(int&i=0;i&10;i++){
UserInfo&userInfo&=&new&UserInfo();
userInfo.setId(UUID.randomUUID().toString());
userInfo.setUsername(Math.random()+"wj"+i);
userInfo.setPassword(Math.random()+"ss"+i);
listUserInfo.add(userInfo);
listUserInfo&=&userInfoService.save(listUserInfo);//可以直接保存一个list集合,当然这里只是测试,实际的批量新增,批量更新的时候,是需要到一定的条数之后,flush一下的,比如20条,这根hibernate是类似的。
userInfoService.delete("21");//删除
UserInfo&userInfo&=&userInfoService.findOne("2eab-419c-b399813");
userInfo.setUsername("zhangsan");
userInfoService.saveAndFlush(userInfo);//更新
Gson&gson&=&new&Gson();
String&jsonStr&=&gson.toJson(listUserInfo);
response.getWriter().println(jsonStr);
}经过测试,大家发现 新增、查询、删除、修改都是正常的Hibernate:&select&userinfo0_.id&as&id1_4_,&userinfo0_.birthday&as&birthday2_4_,&userinfo0_.contact&as&contact3_4_,&userinfo0_.create_time&as&create_t4_4_,&userinfo0_.create_user&as&create_u5_4_,&userinfo0_.delete_flag&as&delete_f6_4_,&userinfo0_.email&as&email7_4_,&userinfo0_.last_login_ip&as&last_log8_4_,&userinfo0_.last_login_time&as&last_log9_4_,&userinfo0_.last_logout_time&as&last_lo10_4_,&userinfo0_.modify_time&as&modify_11_4_,&userinfo0_.online_state&as&online_12_4_,&userinfo0_.password&as&passwor13_4_,&userinfo0_.register_time&as&registe14_4_,&userinfo0_.sex&as&sex15_4_,&userinfo0_.user_state&as&user_st16_4_,&userinfo0_.username&as&usernam17_4_&from&rbac.user_info&userinfo0_&where&userinfo0_.username=?
Hibernate:&insert&into&rbac.user_info&(birthday,&contact,&create_time,&create_user,&delete_flag,&email,&last_login_ip,&last_login_time,&last_logout_time,&modify_time,&online_state,&password,&register_time,&sex,&user_state,&username,&id)&values&(?,&?,&?,&?,&?,&?,&?,&?,&?,&?,&?,&?,&?,&?,&?,&?,&?)
insert&语句打印了10条,
delete&from&rbac.user_info&where&id=?
Hibernate:&update&rbac.user_info&set&birthday=?,&contact=?,&create_time=?,&create_user=?,&delete_flag=?,&email=?,&last_login_ip=?,&last_login_time=?,&last_logout_time=?,&modify_time=?,&online_state=?,&password=?,&register_time=?,&sex=?,&user_state=?,&username=?&where&id=?本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)spring data jpa 自定义全局DAO方法实例教程 | 红颜丽人
spring data jpa 自定义全局DAO方法实例教程。最近项目中采用了spring mvc+jpa的技术架构.其中用到了spring data jpa对jpa的进一步封装.于是顺便研究了一下。
spring data jpa入门可以参考IBM的一篇文章
Spring Data JPA 开发指南
开发了一段时间发现有些需求仍然不能满足,于是想到了自己再封装一层。以下是开发步骤:
1、扩展JpaRepository接口,将来所有dao将继承该接口以实现DAO的封装
package mons.
import java.io.S
import java.util.LinkedHashM
import javax.persistence.Q
import org.springframework.data.domain.P
import org.springframework.data.jpa.repository.JpaR
import org.springframework.data.repository.NoRepositoryB
import mons.util.QueryR
* @author divine
* 针对spring data jpa所提供的接口{@link JpaRepository}再次扩展
* @NoRepositoryBean是必须的
@NoRepositoryBean
public interface GenericRepository&T, ID extends Serializable& extends JpaRepository&T, ID& {
//JpaRepository本身是一个空接口,下面所有的方法声明都是自定义的
* 设置query的参数
* @param query 查询对象
* @param queryParams 参数
public void setQueryParams(Query query, Object[] queryParams);
* 组装ORDER BY 语句
* @param orderby
public String buildOrderby(LinkedHashMap&String, String& orderby);
* 获取实体名
* @param entityClass
public String getEntityName(Class&T& entityClass);
* jpql语句查询
* @param entityClass
* @param whereSql
* @param queryParams
* @param orderby
* @param pageable
public QueryResult&T& getScrollDataByJpql(Class&T& entityClass, String whereJpql, Object[] queryParams,
LinkedHashMap&String, String& orderby, Pageable pageable);
* sql语句查询
* @param sql
* @param queryParams
* @param pageable
public QueryResult&T& getScrollDataBySql(String sql, Object[] queryParams, Pageable pageable);
2、创建自定义JpaRepository的实现
package mons.
import java.beans.I
import java.beans.PropertyD
import java.io.S
import java.lang.reflect.M
import java.util.LinkedHashM
import javax.persistence.EmbeddedId;
import javax.persistence.E
import javax.persistence.EntityM
import javax.persistence.Q
import org.apache.log4j.L
import org.springframework.data.domain.P
import org.springframework.data.jpa.repository.support.JpaEntityI
import org.springframework.data.jpa.repository.support.JpaEntityInformationS
import org.springframework.data.jpa.repository.support.SimpleJpaR
import org.springframework.data.repository.NoRepositoryB
import mons.util.QueryR
* {@link BasicJpaRepository}接口实现类,并在{@link SimpleJpaRepository}基础上扩展。
* @author divine
* @param &T& ORM对象
* @param &ID& 主键ID
@NoRepositoryBean
public class GenericRepositoryImpl&T, ID extends Serializable& extends
SimpleJpaRepository&T, ID& implements GenericRepository&T, ID& {
static Logger logger = Logger.getLogger(GenericRepositoryImpl.class);
private final EntityM
* 构造函数
* @param domainClass
* @param em
public GenericRepositoryImpl(final JpaEntityInformation&T, ?& entityInformation, EntityManager entityManager) {
super(entityInformation, entityManager);
this.em = entityM
* 构造函数
* @param domainClass
* @param em
public GenericRepositoryImpl(Class&T& domainClass, EntityManager em) {
this(JpaEntityInformationSupport.getMetadata(domainClass, em), em);
public void setQueryParams(Query query, Object[] queryParams){
if(null != queryParams && queryParams.length != 0){
for(int i=0;i&queryParams.i++){
query.setParameter(i+1, queryParams[i]);
public String buildOrderby(LinkedHashMap&String, String& orderby) {
// TODO Auto-generated method 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();
public String getEntityName(Class&T& entityClass) {
// TODO Auto-generated method stub
String entityname = entityClass.getSimpleName();
Entity entity = entityClass.getAnnotation(Entity.class);
if(entity.name()!=null && !”".equals(entity.name())){
entityname = entity.name();
public QueryResult&T& getScrollDataByJpql(Class&T& entityClass, String whereJpql, Object[] queryParams,
LinkedHashMap&String, String& orderby, Pageable pageable) {
QueryResult&T& qr = new QueryResult&T&();
String entityname = getEntityName(entityClass);
String sql = “select o from “+ entityname+ ” o “;
String sqlWhere = whereJpql==null? “”: “where “+ whereJ
Query query = em.createQuery(sql+sqlWhere+ buildOrderby(orderby));
setQueryParams(query, queryParams);
if(pageable.getPageNumber()!=-1 && pageable.getPageSize()!=-1)
query.setFirstResult(pageable.getPageNumber()*pageable.getPageSize()).setMaxResults(pageable.getPageSize());
qr.setResultList(query.getResultList());
query = em.createQuery(“select count(“+ getCountField(entityClass)+ “) from “+ entityname+ ” o “+ sqlWhere);
setQueryParams(query, queryParams);
qr.setTotalRecord((Long)query.getSingleResult());
public QueryResult&T& getScrollDataBySql(String sql, Object[] queryParams, Pageable pageable) {
// TODO Auto-generated method stub
//查询记录数
QueryResult&T& qr = new QueryResult&T&();
Query query = em.createNativeQuery(sql);
setQueryParams(query, queryParams);
if(pageable.getPageNumber()!=-1 && pageable.getPageSize()!=-1)
query.setFirstResult(pageable.getPageNumber()*pageable.getPageSize()).setMaxResults(pageable.getPageSize());
qr.setResultList(query.getResultList());
String from = getFromClause(sql);
//查询总记录数
query = em.createQuery(“select count(*) ” + from);
setQueryParams(query, queryParams);
qr.setTotalRecord((Long)query.getSingleResult());
private String getCountField(Class&T& clazz) {
String out = “o”;
PropertyDescriptor[] propertyDescriptors = Introspector.getBeanInfo(clazz).getPropertyDescriptors();
for(PropertyDescriptor propertydesc : propertyDescriptors) {
Method method = propertydesc.getReadMethod();
if(method!=null && method.isAnnotationPresent(EmbeddedId.class)){
PropertyDescriptor[] ps = Introspector.getBeanInfo(propertydesc.getPropertyType()).getPropertyDescriptors();
out = “o.”+ propertydesc.getName()+ “.” + (!ps[1].getName().equals(“class”)? ps[1].getName(): ps[0].getName());
} catch (Exception e) {
e.printStackTrace();
* 从sql中找出from子句
* @param sql
private String getFromClause(String sql) {
String sql2 = sql.toLowerCase();
int index = sql2.indexOf(” from “);
if (index & 0) {
int i1 = sql2.lastIndexOf(” order by “);
int i2 = sql2.lastIndexOf(” group by “);
if (i1 &= 0 && i2 &= 0) {
return sql.substring(index, i1 & i2 ? i2 : i1);
} else if (i1 &= 0) {
return sql.substring(index, i1);
} else if (i2 &= 0) {
return sql.substring(index, i2);
return sql.substring(index);
3、创建自定义Repository的构建工厂
package mons.
import java.io.S
import javax.persistence.EntityM
import org.springframework.data.jpa.repository.JpaR
import org.springframework.data.jpa.repository.support.JpaEntityI
import org.springframework.data.jpa.repository.support.JpaRepositoryF
import org.springframework.data.querydsl.QueryDslPredicateE
import org.springframework.data.querydsl.QueryDslU
import org.springframework.data.repository.core.RepositoryM
import org.springframework.util.A
* @author divine
public class DefaultRepositoryFactory extends JpaRepositoryFactory {
private final EntityManager entityM
public DefaultRepositoryFactory(EntityManager entityManager) {
super(entityManager);
Assert.notNull(entityManager);
this.entityManager = entityM
protected &T, ID extends Serializable& JpaRepository&?, ?& getTargetRepository(RepositoryMetadata metadata, EntityManager entityManager) {
JpaEntityInformation&?, Serializable& entityInformation = getEntityInformation(metadata.getDomainType());
return new GenericRepositoryImpl(entityInformation, entityManager); // custom implementation
protected Class&?& getRepositoryBaseClass(RepositoryMetadata metadata) {
return GenericRepositoryImpl.
4、创建自定义Repository工厂构建器,该类将被注入到spring容器中,是spring管理自定义DAO的入口
package mons.
import java.io.S
import javax.persistence.EntityM
import org.springframework.data.jpa.repository.JpaR
import org.springframework.data.jpa.repository.support.JpaRepositoryFactoryB
import org.springframework.data.repository.core.support.RepositoryFactoryS
* @author divine
public class DefaultRepositoryFactoryBean&T extends JpaRepository&S, ID&, S, ID extends Serializable&
extends JpaRepositoryFactoryBean&T, S, ID& {
* Returns a {@link RepositoryFactorySupport}.
* @param entityManager
protected RepositoryFactorySupport createRepositoryFactory(EntityManager entityManager) {
return new DefaultRepositoryFactory(entityManager);
5、applicationContext.xml中注入DefaultRepositoryFactoryBean
spring data jpa repository
base-package:扫描的包,所有继承GenericRepository的接口所在的包需要在这里定义
repository-impl-postfix:仓库自定义实现类型的后缀
自动扫描并添加到接口的实现
factory-class 仓库接口的实现工厂
&jpa:repositories base-package=”com.trmp,com.platform”
entity-manager-factory-ref=”entityManagerFactory” transaction-manager-ref=”transactionManager” repository-impl-postfix=”Impl”
factory-class=”mons.dao.DefaultRepositoryFactoryBean”&
&/jpa:repositories&
6、如何使用
与使用spring data jpa的方式一样,接口继承GenericRepository,如我定义了一个叫MyRepository的接口。
package com.trmp.base.sceneryManager.
import com.trmp.base.sceneryManager.entity.BaseSceneryI
import mons.dao.GenericR
* @author divine
public interface MyRepository extends GenericRepository&BaseSceneryInfo, Long& {
7、junit测试
package com.trmp.base.sceneryM
import javax.persistence.EntityM
import javax.persistence.PersistenceC
import org.junit.T
import org.junit.runner.RunW
import org.springframework.beans.factory.annotation.A
import org.springframework.data.domain.PageR
import org.springframework.data.domain.P
import org.springframework.test.context.ContextC
import org.springframework.test.context.junit4.SpringJUnit4ClassR
import org.springframework.test.context.transaction.TransactionC
import org.springframework.transaction.annotation.T
import com.trmp.base.sceneryManager.dao.MyR
import com.trmp.base.sceneryManager.entity.BaseSceneryI
import mons.util.QueryR
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={“classpath:applicationContext.xml”})
@TransactionConfiguration(transactionManager=”transactionManager”)
@Transactional
public class SceneryTest {
@PersistenceContext
@Autowired
private MyRepository customD
public void testGetScrollData(){
Pageable pageable = new PageRequest(0, 10);
Object[] params = new Object[]{60L,”%沈%”};
QueryResult qr = customDao.getScrollDataByJpql(BaseSceneryInfo.class, “orgID = ? and cmpName like ? “, params, null, pageable);
System.out.println(qr.getTotalRecord());
8、用到的工具类
package mons.
import java.util.L
* @author divine
* 封装查询结构的对象
* resultList 结构集对象
* totalRecord 总记录数
public class QueryResult&T& {
* 查询结果集
private List resultL
* 总记录数
private Long totalR
public List getResultList() {
return resultL
public void setResultList(List resultList) {
this.resultList = resultL
public Long getTotalRecord() {
return totalR
public void setTotalRecord(Long totalRecord) {
this.totalRecord = totalR
本文链接地址:
本条目发布于 。属于
分类。作者是 。}

我要回帖

更多关于 spring jparepository 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信