Spring Data JPA实践与学习(五)

本文介绍使用Spring Data JPA时不同返回类型的应用场景,包括Stream、Page、Slice及List等,通过具体示例展示了如何在实际项目中进行分页查询。

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 的支持。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值