JpaRepository
2.单元测试
JpaSpecificationExecutor
2.具体功能
2.2 多条件查询
2.3 分页
2.4 排序
2.5 分页排序
本文我们来介绍下SpringDataJPA继承结构中剩下的两个接口
JpaRepository
===========================================================================
JpaRepository 接口是我们开发时使用的最多的接口。其特点是可以帮助我们将其他接口的方法的返回值做适配处理。可以使得我们在开发时更方便的使用这些方法。
1.创建接口
/**
SpringDataJPA 实现JpaRepository
泛型 第一个参数是对应的Pojo类型
第二个参数是注解的包装类型
*/
public interface UserDao extends JpaRepository
}
2.单元测试
/**
@program: spring-data-jpa
@description: 单元测试
@author: 波波烤鸭
@create: 2019-05-18 09:48
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(“classpath:applicationContext.xml”)
public class TestDemo {
@Autowired
private UserDao usersDao;
/**
*/
@Test
@Transactional// 在测试类对于事务提交方式默认的是回滚。
@Rollback(false)//取消自动回滚
public void testInsertUsers(){
Users users = new Users();
users.setUserage(20);
users.setUsername(“张三-jpa”);
this.usersDao.save(users);
}
}
JpaSpecificationExecutor
======================================================================================
完成多条件查询,并且支持分页与排序。
1.创建接口
JpaSpecificationExecutor接口不能够单独使用,需要和其他接口一块使用,如下
/**
JpaSpecificationExecutor 接口讲解
@author Administrator
*注意:JpaSpecificationExecutor:不能单独使用,需要配合着 jpa 中的其他接口一起使用
*/
public interface UserDao extends JpaRepository
, JpaSpecificationExecutor {
}
2.具体功能
/**
单条件查询
需求:根据用户姓名查询数据
*/
@Test
public void test1(){
Specification spec = new Specification() {
/**
@return Predicate:定义了查询条件
@param Root root:根对象。封装了查询条件的对象
@param CriteriaQuery> query:定义了一个基本的查询.一般不
使用
*/
@Override
public Predicate toPredicate(Root root,
CriteriaQuery> query, CriteriaBuilder cb) {
Predicate pre = cb.equal(root.get(“username”), “王五”);
return pre;
}
};
List list = this.usersDao.findAll(spec);
for (Users users : list) {
System.out.println(users);
}
}
多条件查询有两种方式,具体如下
/**
多条件查询 方式一
需求:使用用户姓名以及年龄查询数据
*/
@Test
public void test2() {
Specification spec = new Specification() {
@Override
public Predicate toPredicate(Root root,
CriteriaQuery> query, CriteriaBuilder cb) {
List list = new ArrayList<>();
list.add(cb.equal(root.get(“username”), “王五”));
list.add(cb.equal(root.get(“userage”), 24));
//此时条件之间是没有任何关系的。
Predicate[] arr = new Predicate[list.size()];
return cb.and(list.toArray(arr));
}
};
List list = this.usersDao.findAll(spec);
for (Users users : list) {
System.out.println(users);
}
}
/**
多条件查询 方式二
需求:使用用户姓名或者年龄查询数据
*/
@Test
public void test3(){
Specification spec = new Specification() {
@Override
public Predicate toPredicate(Root root,
CriteriaQuery> query, CriteriaBuilder cb) {
return cb.or(cb.equal(root.get(“username”),"王五 "),cb.equal(root.get(“userage”), 25));
}
};
List list = this.usersDao.findAll(spec);
for (Users users : list) {
System.out.println(users);
}
}
/**
*/
@Test
public void test4(){
//条件
Specification spec = new Specification() {
@Override
public Predicate toPredicate(Root root,
CriteriaQuery> query, CriteriaBuilder cb) {
return cb.like(root.get(“username”).as(String.class), “王%”);
}
};
//分页
Pageable pageable = new PageRequest(2, 2);
Page page = this.usersDao.findAll(spec, pageable);
System.out.println(“总条数:”+page.getTotalElements());
System.out.println(“总页数:”+page.getTotalPages());
List list = page.getContent();
for (Users users : list) {
System.out.println(users);
}
}
/**