- 浏览: 49446 次
文章分类
最新评论
Java代码 收藏代码
public interface JpaSpecificationExecutor<T> {
T findOne(Specification<T> spec);
List<T> findAll(Specification<T> spec);
Page<T> findAll(Specification<T> spec, Pageable pageable);
List<T> findAll(Specification<T> spec, Sort sort);
long count(Specification<T> spec);
}
在这个接口里面出现次数最多的类就是Specification.class,而这个类主要也就是围绕Specification来打造的,Specification.class是Spring Data JPA提供的一个查询规范,而你只需围绕这个规范来设置你的查询条件便可,我们来看一下Specification.class这个接口中有些什么东西。
Specification.class
Java代码 收藏代码
public interface Specification<T> {
Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder cb);
}
只有一个方法toPredicate,而其中的参数大家并不陌生,都是JPA规范中的,ROOT查询中的条件表达式、CriteriaQuery条件查询设计器、CriteriaBuilder条件查询构造器,而我们在使用复杂对象查询时,实现该方法用JPA去构造对象查询便可。
下面来看一个小例子:
Java代码 收藏代码
@Repository("userDao")
public interface IUserDao extends JpaSpecificationExecutor<User>{
}
仍然只是一个空接口,这次继承的是JpaSpecificationExecutor了。
再写一测试用例:查询用户表中name包含Sam的记录,并分页按照birth排倒序
Java代码 收藏代码
public class UserDaoTest {
private static ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
private static IUserDao userDao = (IUserDao) context.getBean("userDao");
public void findBySpecAndPaginate() {
Page<User> page = userDao.findAll(new Specification<User>() {
@Override
public Predicate toPredicate(Root<User> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
root = query.from(User.class);
Path<String> nameExp = root.get("name");
return cb.like(nameExp, "%Sam%");
}
}, new PageRequest(1, 5, new Sort(Direction.DESC, new String[] { "birth" })));
StringBuilder stout = new StringBuilder(" 以下是姓名包含Sam人员信息 : ").append("\n");
stout.append("| 序号 | username | password | name | sex | birth |").append("\n");
int sortIndex = 1;
for (User u : 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);
}
public static void main(String[] args) {
UserDaoTest test = new UserDaoTest();
test.findBySpecAndPaginate();
}
}
当然,这只是一个测试,很简单的一个条件查询方法。你也可以设计复杂的查询来得到自己所需的结果,我这只是写一个很简单的方法来带大家入门。
写了两篇文章了,还没有讲Spring Data JPA为什么只需定义接口就可以使用,其实这也不难发现,查看源码,可以找到针对JpaRepository和JpaSpecificationExecutor有一个实现类,SimpleJpaRepository.class,这个类实现了刚才所提的两个接口。而Spring在给我们注入实现类的时候,就正是这个SimpleJpaRepository.class,具体的实现方式我就不在这意义赘述了,大家如果有兴趣可以去查看它的源码,和传统的JPA实现是一样的。
public interface JpaSpecificationExecutor<T> {
T findOne(Specification<T> spec);
List<T> findAll(Specification<T> spec);
Page<T> findAll(Specification<T> spec, Pageable pageable);
List<T> findAll(Specification<T> spec, Sort sort);
long count(Specification<T> spec);
}
在这个接口里面出现次数最多的类就是Specification.class,而这个类主要也就是围绕Specification来打造的,Specification.class是Spring Data JPA提供的一个查询规范,而你只需围绕这个规范来设置你的查询条件便可,我们来看一下Specification.class这个接口中有些什么东西。
Specification.class
Java代码 收藏代码
public interface Specification<T> {
Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder cb);
}
只有一个方法toPredicate,而其中的参数大家并不陌生,都是JPA规范中的,ROOT查询中的条件表达式、CriteriaQuery条件查询设计器、CriteriaBuilder条件查询构造器,而我们在使用复杂对象查询时,实现该方法用JPA去构造对象查询便可。
下面来看一个小例子:
Java代码 收藏代码
@Repository("userDao")
public interface IUserDao extends JpaSpecificationExecutor<User>{
}
仍然只是一个空接口,这次继承的是JpaSpecificationExecutor了。
再写一测试用例:查询用户表中name包含Sam的记录,并分页按照birth排倒序
Java代码 收藏代码
public class UserDaoTest {
private static ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
private static IUserDao userDao = (IUserDao) context.getBean("userDao");
public void findBySpecAndPaginate() {
Page<User> page = userDao.findAll(new Specification<User>() {
@Override
public Predicate toPredicate(Root<User> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
root = query.from(User.class);
Path<String> nameExp = root.get("name");
return cb.like(nameExp, "%Sam%");
}
}, new PageRequest(1, 5, new Sort(Direction.DESC, new String[] { "birth" })));
StringBuilder stout = new StringBuilder(" 以下是姓名包含Sam人员信息 : ").append("\n");
stout.append("| 序号 | username | password | name | sex | birth |").append("\n");
int sortIndex = 1;
for (User u : 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);
}
public static void main(String[] args) {
UserDaoTest test = new UserDaoTest();
test.findBySpecAndPaginate();
}
}
当然,这只是一个测试,很简单的一个条件查询方法。你也可以设计复杂的查询来得到自己所需的结果,我这只是写一个很简单的方法来带大家入门。
写了两篇文章了,还没有讲Spring Data JPA为什么只需定义接口就可以使用,其实这也不难发现,查看源码,可以找到针对JpaRepository和JpaSpecificationExecutor有一个实现类,SimpleJpaRepository.class,这个类实现了刚才所提的两个接口。而Spring在给我们注入实现类的时候,就正是这个SimpleJpaRepository.class,具体的实现方式我就不在这意义赘述了,大家如果有兴趣可以去查看它的源码,和传统的JPA实现是一样的。
发表评论
-
ObjectMapper对json结构字符串和Java对象的转换
2016-10-18 15:54 8195package com.gtstar.cbos.web.ccs ... -
hibernate的Criteria Query(转)
2016-09-02 12:08 450当查询数据时,人们往往需要设置查询条件。在SQL或HQL语句中 ... -
Spring MVC之@RequestParam @RequestBody @RequestHeader 等详解
2016-08-18 13:45 1911引言: 接上一篇文章,对@RequestMapping进行地址 ... -
dbcTemplate详解
2016-08-12 09:16 5741、JdbcTemplate操作数据库 Spring对数据库的 ... -
Spring JdbcTemplate方法详解
2016-08-03 08:58 2379JdbcTemplate主要提供以下五类方法: •execut ... -
spring data jpa的动态查询封装
2016-07-15 11:31 2968最近使用spring data jpa做了两个项目,对于动态查 ... -
Spring Data 系列之JPA(二)
2016-07-15 10:40 477来一起看一下复杂查询 ... -
Spring Data 系列之JPA(一)
2016-07-15 10:36 496引入: Spring Data是SpringSource基 ... -
springMVC+spring+Hibernate的配置
2016-07-07 12:30 2527本实例采用springMvc冬眠 与 春天进行整合,用spri ... -
JdbcTemplate详解
2016-07-05 16:28 4681、JdbcTemplate操作数据库 Spring对数据库的 ... -
SpringMVC+Hibernate+Spring整合实例(一)
2016-07-05 09:17 523SpringMVC又一个漂亮的web框架,他与Struts2并 ... -
spring关于“transactionAttributes”的相关配置
2016-07-05 09:15 483spring关于“transactionAttri ... -
springMVC 参数传递
2016-07-01 09:39 509SpringMVC的各种参数绑定方式 1. 基本数据类 ...
相关推荐
基于springboot大学生就业信息管理系统源码数据库文档.zip
基于java的驾校收支管理可视化平台的开题报告
时间序列 原木 间隔5秒钟 20241120
毕业设计&课设_基于 Vue 的电影在线预订与管理系统:后台 Java(SSM)代码,为毕业设计项目.zip
基于springboot课件通中小学教学课件共享平台源码数据库文档.zip
基于java的网上购物商城的开题报告
Delphi人脸检测与识别Demo1fdef-main.zip
基于java的咖啡在线销售系统的开题报告
基于java的自助医疗服务系统的开题报告.docx
内容概要:本文档全面介绍了Visual Basic(VB)编程语言的基础知识和高级应用。首先概述了VB的基本特性和开发环境,随后详细讲述了VB的数据类型、变量、运算符、控制结构、数组、过程与函数、变量作用域等内容。接着介绍了窗体设计、控件使用、菜单与工具栏的设计,文件操作、数据库访问等关键知识点。最后讨论了VB的学习方法、发展历史及其在桌面应用、Web应用、数据库应用、游戏开发和自动化脚本编写等领域的广泛应用前景。 适合人群:初学者和中级程序员,尤其是希望快速掌握Windows桌面应用开发的人群。 使用场景及目标:①掌握VB的基础语法和开发环境;②学会使用VB创建复杂的用户界面和功能完整的应用程序;③理解数据库操作、文件管理和网络编程等高级主题。 其他说明:Visual Basic是一种简单易学且功能强大的编程语言,尤其适合用于开发Windows桌面应用。文中不仅覆盖了基础知识,还包括了大量的实用案例和技术细节,帮助读者快速提升编程技能。
基于java的疫情期间高校防控系统开题报告.docx
基于springboot+vue社区老年人帮扶系统源码数据库文档.zip
基于java的超市商品管理系统的开题报告.docx
基于SpringBoot房屋买卖平台源码数据库文档.zip
xdu限通院23微处理器系统与应用大作业(两只老虎),适应于汇编语言keil软件,
<项目介绍> - 新闻类网站系统,基于SSM(Spring、Spring MVC、MyBatis)+MySQL开发,高分成品毕业设计,附带往届论文 - 不懂运行,下载完可以私聊问,可远程教学 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 --------
基于java的学生网上请假系统的开题报告.docx
社会经济繁荣发展的今天,电子商务得到了飞速发展,网上交易越来越彰显出其独特的优越性,在人们的日常生活中,出现了各种类型的交易网站。其中一个就是车辆易主交易网站,它是一个服务于用户买卖二手车辆的交易网站,为用户提供了平等互利、方便快捷的网上交易平台,通过这一类型的网站,用户可自由出售和购买车辆。 本课题主要根据车辆本身的特性,充分发挥互联网的特点与优势,构建一个以二手车辆为商品、基于互联网平台的车辆易主业务交易管理系统,并根据车辆易主业务交易管理系统的应用需求,进行需求分析,进而对网站系统作规划设计。采用IDEA为运行平台,以SSH为框架,运用HTML语言、JSP技术、MySql数据库、JSP与后台数据库链接等关键技术建设二手车网上交易系统,构建车辆易主交易系统的会员注册与登录,网站首页展示、用户发布商品车辆,用户求购商品车辆,分页浏览、购物系统、用户后台管理、管理员用户后台管理等功能,并使这些功能得以实现并更好为用户服务。网站整体构建完成且测试成功后,用户可以进入网站进行注册、登录,登录后,用户可以在网站上发布自己的闲置车辆或者寻找想要购买的车辆,还可以收藏车辆,管理发布和收藏的车辆,
SQLite3的向量扩展库,windows dll,版本0.1.5
基于C++实现(控制台)商品库存管理系统