`

JpaSpecificationExecutor.class

阅读更多
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实现是一样的。
分享到:
评论

相关推荐

    spring data jpa分页查询示例代码

    public interface CameraInfoRepo extends JpaRepository, String&gt;, JpaSpecificationExecutor&lt;CameraInfoPO&gt; { public Page&lt;CameraInfoPO&gt; findByIsEnabled(Integer isEnabled, Pageable pageable); } ``` 在...

    2.0jpa查询学习笔记1

    public interface UserRepository extends JpaRepository, Long&gt;, JpaSpecificationExecutor&lt;User&gt; { // ... } public static Specification&lt;User&gt; searchByCriteria(String name, String email) { return (root,...

    Hibernate和Spring集成分页方法.rar

    public interface UserRepository extends JpaRepository, Long&gt;, JpaSpecificationExecutor&lt;User&gt; { } Page&lt;User&gt; findAll(Pageable pageable); ``` 在服务层,你可以创建一个`PageRequest`对象,传入当前页、...

    spring data jpa.jar

    提供了审计功能,可以自动记录实体的创建时间和修改时间,通过`@CreatedDate`、`@LastModifiedDate`和`@EntityListeners(AuditingEntityListener.class)`等注解实现。 10. **集成其他Spring Data模块** Spring ...

    前台Java通用分页详解描述下

    public interface UserRepository extends JpaRepository, Long&gt;, JpaSpecificationExecutor&lt;User&gt; { Page&lt;User&gt; findAll(Pageable pageable); } ``` 2. **MyBatis 分页** MyBatis 使用`RowBounds`对象进行...

    在IntelliJ IDEA中通过Spring Boot集成达梦数据库:从入门到精通

    如果你需要自定义SQL查询,可以扩展`JpaSpecificationExecutor`接口。 7. **编写业务逻辑** 在Spring Boot的控制器类中注入Repository接口,编写处理HTTP请求的方法,调用Repository接口完成数据的增删改查。 8. ...

    SpringBoot中使用Spring-data-jpa分页查询

    public interface BookRepository extends JpaRepository, Long&gt;, JpaSpecificationExecutor&lt;Book&gt; { Page&lt;Book&gt; findAllByName(String name, Pageable pageable); } ``` 在上面的代码中,`Pageable`接口用于传递...

    在Spring Boot中使用Spring-data-jpa实现分页查询

    我们可以使用 `Specification` 接口来定义查询条件,然后使用 `JpaSpecificationExecutor` 接口来执行查询。 在分页查询中,我们可以使用 `Pageable` 接口来实现分页。例如: ```java @Service public class ...

    springboot-jpa 条件分页

    public interface UserRepository extends JpaRepository, Long&gt;, JpaSpecificationExecutor&lt;User&gt; { } public class UserSpecification implements Specification&lt;User&gt; { private Map, Object&gt; params; public...

    Spring-data-jpa 学习笔记.docx

    public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "name") private String name; @Column(name = "email") private String email; // ...

    Spring Boot项目学习之通用权限管理项目02

    假设我们有一个名为`User`的实体,我们可以通过`JpaRepository`的扩展接口`JpaSpecificationExecutor`来实现自定义的查询,并结合`Pageable`进行分页: ```java public interface UserRepository extends Jpa...

    Java EE常用框架.xmind

    使用mvn编译,而后在class目录生成jar包,使用Java命令来启动 使用@configurationProperties和@Value注解来获取SpringBoot配置文件上的信息 使用@SpringBootTest来搭建测试环境,使用@AutoConfigueMockMVC类...

    jpa-spec:jpa规范助手

    public interface PersonRepository extends JpaRepository&lt; Person&gt; , JpaSpecificationExecutor&lt; Person&gt; { } 또는 @Repository public interface PersonRepository extends JpaSpecificationRepository...

Global site tag (gtag.js) - Google Analytics