- 浏览: 49700 次
文章分类
最新评论
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 8197package com.gtstar.cbos.web.ccs ... -
hibernate的Criteria Query(转)
2016-09-02 12:08 452当查询数据时,人们往往需要设置查询条件。在SQL或HQL语句中 ... -
Spring MVC之@RequestParam @RequestBody @RequestHeader 等详解
2016-08-18 13:45 1914引言: 接上一篇文章,对@RequestMapping进行地址 ... -
dbcTemplate详解
2016-08-12 09:16 5791、JdbcTemplate操作数据库 Spring对数据库的 ... -
Spring JdbcTemplate方法详解
2016-08-03 08:58 2381JdbcTemplate主要提供以下五类方法: •execut ... -
spring data jpa的动态查询封装
2016-07-15 11:31 2973最近使用spring data jpa做了两个项目,对于动态查 ... -
Spring Data 系列之JPA(二)
2016-07-15 10:40 482来一起看一下复杂查询 ... -
Spring Data 系列之JPA(一)
2016-07-15 10:36 500引入: Spring Data是SpringSource基 ... -
springMVC+spring+Hibernate的配置
2016-07-07 12:30 2531本实例采用springMvc冬眠 与 春天进行整合,用spri ... -
JdbcTemplate详解
2016-07-05 16:28 4721、JdbcTemplate操作数据库 Spring对数据库的 ... -
SpringMVC+Hibernate+Spring整合实例(一)
2016-07-05 09:17 528SpringMVC又一个漂亮的web框架,他与Struts2并 ... -
spring关于“transactionAttributes”的相关配置
2016-07-05 09:15 486spring关于“transactionAttri ... -
springMVC 参数传递
2016-07-01 09:39 526SpringMVC的各种参数绑定方式 1. 基本数据类 ...
相关推荐
public interface CameraInfoRepo extends JpaRepository, String>, JpaSpecificationExecutor<CameraInfoPO> { public Page<CameraInfoPO> findByIsEnabled(Integer isEnabled, Pageable pageable); } ``` 在...
public interface UserRepository extends JpaRepository, Long>, JpaSpecificationExecutor<User> { // ... } public static Specification<User> searchByCriteria(String name, String email) { return (root,...
public interface UserRepository extends JpaRepository, Long>, JpaSpecificationExecutor<User> { } Page<User> findAll(Pageable pageable); ``` 在服务层,你可以创建一个`PageRequest`对象,传入当前页、...
提供了审计功能,可以自动记录实体的创建时间和修改时间,通过`@CreatedDate`、`@LastModifiedDate`和`@EntityListeners(AuditingEntityListener.class)`等注解实现。 10. **集成其他Spring Data模块** Spring ...
public interface UserRepository extends JpaRepository, Long>, JpaSpecificationExecutor<User> { Page<User> findAll(Pageable pageable); } ``` 2. **MyBatis 分页** MyBatis 使用`RowBounds`对象进行...
如果你需要自定义SQL查询,可以扩展`JpaSpecificationExecutor`接口。 7. **编写业务逻辑** 在Spring Boot的控制器类中注入Repository接口,编写处理HTTP请求的方法,调用Repository接口完成数据的增删改查。 8. ...
public interface BookRepository extends JpaRepository, Long>, JpaSpecificationExecutor<Book> { Page<Book> findAllByName(String name, Pageable pageable); } ``` 在上面的代码中,`Pageable`接口用于传递...
我们可以使用 `Specification` 接口来定义查询条件,然后使用 `JpaSpecificationExecutor` 接口来执行查询。 在分页查询中,我们可以使用 `Pageable` 接口来实现分页。例如: ```java @Service public class ...
public interface UserRepository extends JpaRepository, Long>, JpaSpecificationExecutor<User> { } public class UserSpecification implements Specification<User> { private Map, Object> params; public...
public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "name") private String name; @Column(name = "email") private String email; // ...
假设我们有一个名为`User`的实体,我们可以通过`JpaRepository`的扩展接口`JpaSpecificationExecutor`来实现自定义的查询,并结合`Pageable`进行分页: ```java public interface UserRepository extends Jpa...
使用mvn编译,而后在class目录生成jar包,使用Java命令来启动 使用@configurationProperties和@Value注解来获取SpringBoot配置文件上的信息 使用@SpringBootTest来搭建测试环境,使用@AutoConfigueMockMVC类...
public interface PersonRepository extends JpaRepository< Person> , JpaSpecificationExecutor< Person> { } 또는 @Repository public interface PersonRepository extends JpaSpecificationRepository...