继
上一篇文章对Spring Data JPA更深(
)一步剖析。
上一篇只是简单的介绍了Spring Data JPA的简单使用,而往往在项目中这一点功能并不能满足我们的需求。这是当然的,在业务中查询是一件非常头疼的事,毕竟不可能只是对一张表的查询是吧? 其实在业务中往往会涉及到多张表的查询,以及查询时需要的各种条件。当然这不用担心,毕竟这是对JPA的支持,而我们在用JPA原生态API的时候往往可能会把一些个方法写得很凌乱,没得一个具体的规范来写自己的方法在后期维护上肯定会很困难。当然你自己也可以封装一些方法来使用,而当我们使用到Spring Data JPA时,它已经帮助我们完成了这个方法的规范了。
来一起看一下复杂查询时它为我们提供的接口。
JpaSpecificationExecutor.class
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
public interface Specification<T> {
Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder cb);
}
只有一个方法toPredicate,而其中的参数大家并不陌生,都是JPA规范中的,ROOT查询中的条件表达式、CriteriaQuery条件查询设计器、CriteriaBuilder条件查询构造器,而我们在使用复杂对象查询时,实现该方法用JPA去构造对象查询便可。
下面来看一个小例子:
@Repository("userDao")
public interface IUserDao extends JpaSpecificationExecutor<User>{
}
仍然只是一个空接口,这次继承的是JpaSpecificationExecutor了。
再写一测试用例:查询用户表中name包含Sam的记录,并分页按照birth排倒序
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实现是一样的。
通过这篇文章我们学习到了,当要使用复杂的条件查询时,我们可以选择使用此接口来完善我们的需求,这篇文章就讲到这里,在下一篇文章中我主要是讲Spring Data JPA为我们提供的注解查询。
分享到:
相关推荐
10. **Spring Data**:Spring Data是一个项目集合,旨在简化数据访问层的开发,支持多种数据库,如JPA、MongoDB等。它提供了统一的API,使得数据操作更加便捷。 通过学习以上知识点,并结合实际项目,你可以逐步...
《Spring揭秘》这本书将通过实例和详细的解释,引导读者一步步掌握这些核心概念和技术,无论你是初学者还是经验丰富的开发者,都能从中受益匪浅。通过阅读本书,你可以深入理解Spring框架的工作原理,并能熟练地将其...
每个章节都可能涵盖了一个或多个具体的功能点,比如如何创建第一个 Spring Boot 应用,如何配置数据库,如何使用 Spring Data JPA 进行数据操作,以及如何实现 RESTful API 等。通过这个教程,你可以逐步深入理解 ...
本教程将带你一步步了解Spring的核心概念,包括IoC(控制反转)、AOP(面向切面编程)以及Spring Boot的快速启动特性。 一、Spring核心:依赖注入(DI/IoC) 依赖注入是Spring框架的核心机制,它允许对象之间的...
【标题】:深入理解Spring框架搭建过程 【摘要】:本文详细阐述了如何逐步搭建Java中的Spring框架,从...随着对Spring的理解不断深入,你还可以探索Spring Boot、Spring Data JPA等更高级的特性,进一步提升开发效率。
《Spring源码从入门到...从基础概念到高级用法,再到内部实现机制,一步步深入Spring的世界,虽然可能会遇到挑战,但收获的将是深度理解和实战技能的提升。对于想要提升自身技术水平的开发者来说,这是一条必经之路。
本教程将带你一步步地探索Spring的世界。 1. **Spring框架概述** - Spring的核心理念是依赖注入(Dependency Injection,DI),它通过控制反转(Inversion of Control,IoC)来管理对象的生命周期和相互依赖关系。...
在当前的IT行业中,前后端分离的开发模式已经成为主流,特别是在Web应用开发...这个学习型项目将引导你通过实际操作,一步步掌握这些技术和最佳实践。通过实践,你将能够独立地开发出高效、易于维护的前后端分离应用。
这篇博文通过一步步的教程,将引导我们深入了解如何使用Spring MVC构建一个简单的Web应用。 首先,我们需要了解Spring MVC的基本组件和它们的作用: 1. **DispatcherServlet**:这是Spring MVC的前端控制器,负责...
《构建Spring框架:深入理解与实践》 Spring框架作为Java企业级应用开发的基石,以其模块化、松...动手实践是巩固理论知识的最佳途径,因此,强烈建议你按照教程一步步操作,亲自构建Spring,以加深理解和应用能力。
本教程将带你一步步走进Spring Boot的世界。 ### 1. 创建Spring Boot项目 在IntelliJ IDEA(Idea)中创建Spring Boot项目,首先选择"New Project",然后在项目模板中找到"Spring Initializr"。这里你可以选择所需...
这篇小记将深入探讨Spring的主要组件和关键特性,带你一步步走进Spring的世界。 首先,我们要理解Spring的核心——依赖注入。在传统的Java程序中,对象之间的依赖关系通常是硬编码的,这使得代码难以测试和维护。...
本案例将带你一步步走进 Spring Boot 的世界,体验其强大的功能和简洁的开发方式。 ### 1. Spring Boot基础知识 Spring Boot 基于 Spring Framework,但并非其一部分。它提供了快速构建、配置和部署应用程序的能力...
这个入门级Demo将带你一步步了解SpringBoot的项目结构、配置、数据访问以及前端展示,是学习SpringBoot和相关技术的良好起点。在实践中,你可以根据需求扩展功能,如添加更多控制器、完善用户认证等,逐步提升对...
通过这份"Spring首选资料(从入门到深入)",你将一步步了解Spring的各个方面,从基本概念到高级特性,从简单的配置到复杂的架构设计,逐步成长为Spring框架的专家。无论是初学者还是经验丰富的开发者,都能从中受益...
总的来说,这个压缩包资源是一个学习Spring Boot基础和实践操作的好材料,通过一步步的实践,读者可以掌握Spring Boot的核心概念,理解自动配置的工作原理,熟悉开发流程,并且能够运用到实际的企业级项目开发中。
本指南将详细介绍如何一步步搭建一个基于Spring的项目环境。 1. **安装Java开发工具(JDK)** - 首先,确保你的计算机上已经安装了JDK,并且版本至少为1.8,因为Spring框架支持这个版本及以上。 - 下载并安装JDK,...
Spring Boot 是一个由 Pivotal 团队开发的框架,旨在简化 Spring 应用程序的初始搭建以及开发过程。它的核心特性是可以内嵌...记得跟着文档一步步操作,理解每个部分的功能,将有助于深入掌握Spring Boot的精髓。
总的来说,Spring基础教程将带你了解如何配置和使用Spring框架,从Bean的声明和装配,到AOP和数据访问,再到Web应用的开发,一步步建立起对Spring全面的理解。通过学习,你将能够利用Spring的强大功能,提升开发效率...
SpringData JPA提供了对多种数据库的抽象,简化了数据库操作。通过Repository接口,开发者可以快速实现CRUD操作,同时支持复杂查询。 5. **Thymeleaf模板引擎** Thymeleaf是一种流行的HTML模板引擎,可以与...