`
- 浏览:
145918 次
-
一步步学习 Spring Data 系列之JPA(二)
继上一篇文章对Spring
Data JPA更深()一步剖析。上一篇只是简单的介绍了Spring Data JPA的简单使用,而往往在项目中这一点功能并不能满足我们的需求。这是当然的,在业务中查询是一件非常头疼的事,毕竟不可能只是对一张表的查询是吧? 其实在业务中往往会涉及到多张表的查询,以及查询时需要的各种条件。当然这不用担心,毕竟这是对JPA的支持,而我们在用JPA原生态API的时候往往可能会把一些个方法写得很凌乱,没得一个具体的规范来写自己的方法在后期维护上肯定会很困难。当然你自己也可以封装一些方法来使用,而当我们使用到Spring
Data JPA时,它已经帮助我们完成了这个方法的规范了。来一起看一下复杂查询时它为我们提供的接口。JpaSpecificationExecutor.class
-
publicinterfaceJpaSpecificationExecutor<T>{
-
-
TfindOne(Specification<T>spec);
-
-
List<T>findAll(Specification<T>spec);
-
-
Page<T>findAll(Specification<T>spec,Pageablepageable);
-
-
List<T>findAll(Specification<T>spec,Sortsort);
-
-
longcount(Specification<T>spec);
-
}
在这个接口里面出现次数最多的类就是Specification.class,而这个类主要也就是围绕Specification来打造的,Specification.class是Spring Data JPA提供的一个查询规范,而你只需围绕这个规范来设置你的查询条件便可,我们来看一下Specification.class这个接口中有些什么东西。Specification.class
-
publicinterfaceSpecification<T>{
-
-
PredicatetoPredicate(Root<T>root,CriteriaQuery<?>query,CriteriaBuildercb);
-
}
只有一个方法toPredicate,而其中的参数大家并不陌生,都是JPA规范中的,ROOT查询中的条件表达式、CriteriaQuery条件查询设计器、CriteriaBuilder条件查询构造器,而我们在使用复杂对象查询时,实现该方法用JPA去构造对象查询便可。下面来看一个小例子:
-
@Repository("userDao")
-
publicinterfaceIUserDaoextendsJpaSpecificationExecutor<User>{
-
}
仍然只是一个空接口,这次继承的是JpaSpecificationExecutor了。再写一测试用例:查询用户表中name包含Sam的记录,并分页按照birth排倒序
-
publicclassUserDaoTest{
-
-
privatestaticApplicationContextcontext=newClassPathXmlApplicationContext("applicationContext.xml");
-
-
privatestaticIUserDaouserDao=(IUserDao)context.getBean("userDao");
-
-
publicvoidfindBySpecAndPaginate(){
-
Page<User>page=userDao.findAll(newSpecification<User>(){
-
@Override
-
publicPredicatetoPredicate(Root<User>root,CriteriaQuery<?>query,CriteriaBuildercb){
-
root=query.from(User.class);
-
Path<String>nameExp=root.get("name");
-
returncb.like(nameExp,"%Sam%");
-
}
-
-
},newPageRequest(1,5,newSort(Direction.DESC,newString[]{"birth"})));
-
-
StringBuilderstout=newStringBuilder("以下是姓名包含Sam人员信息:").append("\n");
-
stout.append("|序号|username|password|name|sex|birth|").append("\n");
-
intsortIndex=1;
-
for(Useru:page.getContent()){
-
stout.append("|").append(sortIndex);
-
stout.append("|").append(u.getUsername());
-
stout.append("|").append(u.getPassword());
-
stout.append("|").append(u.getName());
-
stout.append("|").append(u.getSex());
-
stout.append("|").append(u.getBirth());
-
stout.append("|\n");
-
sortIndex++;
-
}
-
System.err.println(stout);
-
}
-
-
publicstaticvoidmain(String[]args){
-
UserDaoTesttest=newUserDaoTest();
-
test.findBySpecAndPaginate();
-
}
-
}
当然,这只是一个测试,很简单的一个条件查询方法。你也可以设计复杂的查询来得到自己所需的结果,我这只是写一个很简单的方法来带大家入门。写了两篇文章了,还没有讲Spring Data JPA为什么只需定义接口就可以使用,其实这也不难发现,查看源码,可以找到针对JpaRepository和JpaSpecificationExecutor有一个实现类,SimpleJpaRepository.class,这个类实现了刚才所提的两个接口。而Spring在给我们注入实现类的时候,就正是这个SimpleJpaRepository.class,具体的实现方式我就不在这意义赘述了,大家如果有兴趣可以去查看它的源码,和传统的JPA实现是一样的。
通过这篇文章我们学习到了,当要使用复杂的条件查询时,我们可以选择使用此接口来完善我们的需求,这篇文章就讲到这里,在下一篇文章中我主要是讲Spring Data JPA为我们提供的注解查询。
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
Spring Data JPA API。 Spring Data JPA 开发文档。 官网 Spring Data JPA API。
赠送jar包:spring-data-jpa-2.0.9.RELEASE.jar; 赠送原API文档:spring-data-jpa-2.0.9.RELEASE-javadoc.jar; 赠送源代码:spring-data-jpa-2.0.9.RELEASE-sources.jar; 赠送Maven依赖信息文件:spring-data-jpa...
spring data jpa最新版本1.8.0,包含了spring-data-jpa-1.8.0.RELEASE.jar,spring-data-jpa-1.8.0.RELEASE-javadoc.jar以及 spring-data-jpa-1.8.0.RELEASE-sources.jar文档和源代码
spring注解完整版+spring data jpa官方文档中文翻译+JPA2.0官方文档 文档内容齐全 值得参考学习
Spring Data JPA中文文档1.4.3
技术架构:SpringMVC3+Spring3.1.2+Spring Data JPA+Maven 声明:该应用仅仅是技术研究:Spring Data JPA的配置和常见api的使用&maven构建项目,其他技术不在此研究 内涵sql和各种Spring Data JPA测试和案例,导入&...
赠送jar包:spring-data-jpa-2.0.9.RELEASE.jar; 赠送原API文档:spring-data-jpa-2.0.9.RELEASE-javadoc.jar; 赠送源代码:spring-data-jpa-2.0.9.RELEASE-sources.jar; 赠送Maven依赖信息文件:spring-data-jpa...
spring-data-jpa知识。
使用Spring MVC3.0+Spring+Spring data JPA 参照springside的一个小Demo
'SpringDataJPA从入门到精通'分为12章 内容包括整体认识JPA、JPA基础查询方法、定义查询方法、注解式查询方法、@Entity实例里面常用注解详解、JpaRepository扩展详解、JPA的MVC扩展REST支持、DataSource的配置、乐观...
spring-data-jpa spring data jap
Spring Data JPA 简化 JPA 开发
spring-data-jpa
Spring Boot使用spring-data-jpa配置Mysql多数据源,可用版本
这是 《使用 Spring Data JPA 简化 JPA 开发》的sample code。原文在 http://www.ibm.com/developerworks/cn/opensource/os-cn-spring-jpa/index.html
3. 与Spring全家桶结合紧密: 4. 成熟的框架和架构 常⻅的SQL性能问题,如何优雅处理? 2. 错综复杂的关联关系如何应对? 3. 万恶的LazyException本质是什么? 4. ⾼并发⾼性能要求的API服务要⽤JPA吗?
SpringBoot是一款基于Spring框架的开发框架,而Spring-data-JPA是在Hibernate的基础上实现JPA规范的ORM框架。使用SpringBoot和Spring-data-jpa进行分页查询可以大大简化编码流程并提高开发效率。 在使用Spring-data...
Spring Data JPA Demo
spring-data-jpa-1.5.2
NULL 博文链接:https://mixo44.iteye.com/blog/1797079