欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring Data 系列之JPA(二)

程序员文章站 2022-07-16 18:34:37
...
来一起看一下复杂查询时它为我们提供的接口。

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
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(); 
    } 



当然,这只是一个测试,很简单的一个条件查询方法。你也可以设计复杂的查询来得到自己所需的结果,我这只是写一个很简单的方法来带大家入门。


相关标签: jpa spring