Repository 的返回结果
通过SimpleJpaRepository 直接看它的 Structure 就可以知道,它实现的方法,以及父类接口的方法和返回类型包括:Optional、Iterable、List、Page、Long、Boolean、Entity 对象等,而实际上支持的返回类型还要多一些。

由于 Repository 里面支持 Iterable,所以其实 java 标准的 List、Set 都可以作为返回结果,并且也会支持其子类,Spring Data 里面定义了一个特殊的子类 Steamable,Streamable 可以替代 Iterable 或任何集合类型。它还提供了方便的方法来访问 Stream,可以直接在元素上进行 ….filter(…) 和 ….map(…) 操作,并将 Streamable 连接到其他元素。
返回结果类型 List/Stream/Page/Slice
样例代码:UserRepository
public interface UserRepository extends JpaRepository<User,Long> {
//自定义一个查询方法,返回Stream对象,并且有分页属性
@Query("select u from User u")
Stream<User> findAllByCustomQueryAndStream(Pageable pageable);
//测试Slice的返回结果
@Query("select u from User u")
Slice<User> findAllByCustomQueryAndSlice(Pageable pageable);
}
测试:
@RestController
@RequestMapping(path = "/api/v1")
public class UserController {
@Autowired
private UserRepository userRepository;
@PostMapping("/test1")
@Transactional
public void testSaveUser1() throws JsonProcessingException {
//我们新增7条数据方便测试分页结果
userRepository.save(User.builder().name("wang1").email("1@126.com").build());
userRepository.save(User.builder().name("wang2").email("12@126.com").build());
userRepository.save(User.builder().name("wang3").email("123@126.com").build());
userRepository.save(User.builder().name("wang4").email("1234@126.com").build());
userRepository.save(User.builder().name("wang5").email("12345@126.com").build());
userRepository.save(User.builder().name("wang6").email("123456@126.com").build());
userRepository.save(User.builder().name("wang7").email("1234567@126.com").build());
//我们利用ObjectMapper将我们的返回结果Json to String
ObjectMapper objectMapper = new ObjectMapper();
//返回Stream类型结果(1)
Stream<User> userStream = userRepository.findAllByCustomQueryAndStream(PageRequest.of(1,3));
userStream.forEach(System.out::println);
System.out.println("======================================");
}
@PostMapping("/test2")
@Transactional
public void testSaveUser2() throws JsonProcessingException {
ObjectMapper objectMapper = new ObjectMapper();
//返回分页数据(2)
Page<User> userPage = userRepository.findAll(PageRequest.of(0,3));
System.out.println(objectMapper.writeValueAsString(userPage));
System.out.println("======================================");
}
@PostMapping("/test3")
@Transactional
public void testSaveUser3() throws JsonProcessingException {
ObjectMapper objectMapper = new ObjectMapper();
//返回Slice结果(3)
Slice<User> userSlice = userRepository.findAllByCustomQueryAndSlice(PageRequest.of(0,3));
System.out.println(objectMapper.writeValueAsString(userSlice));
System.out.println("======================================");
}
@PostMapping("/test4")
@Transactional
public void testSaveUser4() throws JsonProcessingException {
ObjectMapper objectMapper = new ObjectMapper();
//返回List结果(4)
List<User> userList = userRepository.findAllById(Lists.newArrayList(1L,2L));
System.out.println(objectMapper.writeValueAsString(userList));
System.out.println("======================================");
}
}
然后通过postman发送请求,我们分别看下四种测试结果:
test1:
User(id=61, name=wang4, email=1234@126.com)
User(id=62, name=wang5, email=12345@126.com)
User(id=63, name=wang6, email=123456@126.com)
======================================
test2:
{"content":[
{"id":58,"name":"wang1","email":"1@126.com"},{"id":59,"name":"wang2","email":"12@126.com"},
{"id":60,"name":"wang3","email":"123@126.com"}
],
"pageable":
{"sort":
{"sorted":false,"unsorted":true,"empty":true},
"offset":0,
"pageSize":3,
"pageNumber":0,
"paged":true,
"unpaged":false},
"last":false,
"totalPages":3,
"totalElements":7,
"number":0,
"size":3,
"sort":
{"sorted":false,
"unsorted":true,
"empty":true},
"numberOfElements":3,
"first":true,
"empty":false
}
test3:
{"content":[{"id":58,"name":"wang1","email":"1@126.com"},{"id":59,"name":"wang2","email":"12@126.com"},{"id":60,"name":"wang3","email":"123@126.com"}],"pageable":{"sort":{"sorted":false,"unsorted":true,"empty":true},"offset":0,"pageSize":3,"pageNumber":0,"paged":true,"unpaged":false},"number":0,"size":3,"sort":{"sorted":false,"unsorted":true,"empty":true},"numberOfElements":3,"last":false,"first":true,"empty":false}
test4:
需要调整代码,因为1,2的id不存在,改为61,62。。。
[{"id":61,"name":"wang4","email":"1234@126.com"},{"id":62,"name":"wang5","email":"12345@126.com"}]
上面四种方法介绍了常见的多条数据返回结果的形式,基本上就是对 JDK8 的 Optional 的支持。
本文介绍使用Spring Data JPA时不同返回类型的应用场景,包括Stream、Page、Slice及List等,通过具体示例展示了如何在实际项目中进行分页查询。
832

被折叠的 条评论
为什么被折叠?



