当前位置:网站首页>利用 Repository 中的方法解决实际问题
利用 Repository 中的方法解决实际问题
2022-06-26 10:34:00 【InfoQ】
Repository 的返回结果有哪些

public interface UserRepository extends JpaRepository<User,Long> {
}
User user = userRepository.save(User.builder().name("jackxx").email("[email protected]").sex("man").address("shanghai").build());
Assert.assertNotNull(user);
Streamable<User> userStreamable = userRepository.findAll(PageRequest.of(0,10)).and(User.builder().name("jack222").build());
userStreamable.forEach(System.out::println);
User(id=1, name=jackxx, [email protected], sex=man, address=shanghai)
User(id=null, name=jack222, email=null, sex=null, address=null)
<User>
自定义 Streamable
class Product { (1)
MonetaryAmount getPrice() { … }
}
@RequiredArgConstructor(staticName = "of")
class Products implements Streamable<Product> { (2)
private Streamable<Product> streamable;
public MonetaryAmount getTotal() { (3)
return streamable.stream() //
.map(Priced::getPrice)
.reduce(Money.of(0), MonetaryAmount::add);
}
}
interface ProductRepository implements Repository<Product, Long> {
Products findAllByDescriptionContaining(String text); (4)
}
<Product>
<Product>
<Product>

返回结果类型 List/Stream/Page/Slice
package com.example.jpa.example1;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import java.util.stream.Stream;
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);
}
package com.example.jpa.example1;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.assertj.core.util.Lists;
import org.junit.Assert;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Slice;
import org.springframework.data.util.Streamable;
import java.util.List;
import java.util.stream.Stream;
@DataJpaTest
public class UserRepositoryTest {
@Autowired
private UserRepository userRepository;
@Test
public void testSaveUser() throws JsonProcessingException {
//我们新增7条数据方便测试分页结果
userRepository.save(User.builder().name("jack1").email("[email protected]").sex("man").address("shanghai").build());
userRepository.save(User.builder().name("jack2").email("[email protected]").sex("man").address("shanghai").build());
userRepository.save(User.builder().name("jack3").email("[email protected]").sex("man").address("shanghai").build());
userRepository.save(User.builder().name("jack4").email("[email protected]").sex("man").address("shanghai").build());
userRepository.save(User.builder().name("jack5").email("[email protected]").sex("man").address("shanghai").build());
userRepository.save(User.builder().name("jack6").email("[email protected]").sex("man").address("shanghai").build());
userRepository.save(User.builder().name("jack7").email("[email protected]").sex("man").address("shanghai").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);
//返回分页数据(2)
Page<User> userPage = userRepository.findAll(PageRequest.of(0,3));
System.out.println(objectMapper.writeValueAsString(userPage));
//返回Slice结果(3)
Slice<User> userSlice = userRepository.findAllByCustomQueryAndSlice(PageRequest.of(0,3));
System.out.println(objectMapper.writeValueAsString(userSlice));
//返回List结果(4)
List<User> userList = userRepository.findAllById(Lists.newArrayList(1L,2L));
System.out.println(objectMapper.writeValueAsString(userList));
}
}
<User>
Stream<User> stream;
try {
stream = repository.findAllByCustomQueryAndStream()
stream.forEach(…);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (stream!=null){
stream.close();
}
}
<User>
{
"content":[
{
"id":1,
"name":"jack1",
"email":"[email protected]",
"sex":"man",
"address":"shanghai"
},
{
"id":2,
"name":"jack2",
"email":"[email protected]",
"sex":"man",
"address":"shanghai"
},
{
"id":3,
"name":"jack3",
"email":"[email protected]",
"sex":"man",
"address":"shanghai"
}
],
"pageable":{
"sort":{
"sorted":false,
"unsorted":true,
"empty":true
},
"pageNumber":0,当前页码
"pageSize":3,页码大小
"offset":0,偏移量
"paged":true,是否分页了
"unpaged":false
},
"totalPages":3,一共有多少页
"last":false,是否是到最后
"totalElements":7,一共多少调数
"numberOfElements":3,当前数据下标
"sort":{
"sorted":false,
"unsorted":true,
"empty":true
},
"size":3,当前content大小
"number":0,当前页面码的索引
"first":true,是否是第一页
"empty":false是否有数据
}
<User>
- content:数据的内容,现在指 User 的 List 3 条。
- pageable:分页数据,包括排序字段是什么及其方向、当前是第几页、一共多少页、是否是最后一条等。
- 当前数据的描述:“size”:3,当前 content 大小;“number”:0,当前页面码的索引; “first”:true,是否是第一页;“empty”:false,是否没有数据。
<User>
{
"content":[
{
"id":4,
"name":"jack4",
"email":"[email protected]",
"sex":"man",
"address":"shanghai"
},
{
"id":5,
"name":"jack5",
"email":"[email protected]",
"sex":"man",
"address":"shanghai"
},
{
"id":6,
"name":"jack6",
"email":"[email protected]",
"sex":"man",
"address":"shanghai"
}
],
"pageable":{
"sort":{
"sorted":false,
"unsorted":true,
"empty":true
},
"pageNumber":1,
"pageSize":3,
"offset":3,
"paged":true,
"unpaged":false
},
"numberOfElements":3,
"sort":{
"sorted":false,
"unsorted":true,
"empty":true
},
"size":3,
"number":1,
"first":false,
"last":false,
"empty":false
}
查询分页数据
Hibernate: select user0_.id as id1_0_, user0_.address as address2_0_, user0_.email as email3_0_, user0_.name as name4_0_, user0_.sex as sex5_0_ from user user0_ limit ?
计算分页数据
Hibernate: select count(user0_.id) as col_0_0_ from user user0_
Hibernate: select user0_.id as id1_0_, user0_.address as address2_0_, user0_.email as email3_0_, user0_.name as name4_0_, user0_.sex as sex5_0_ from user user0_ limit ? offset ?
<User>
[
{
"id":1,
"name":"jack1",
"email":"[email protected]",
"sex":"man",
"address":"shanghai"
},
{
"id":2,
"name":"jack2",
"email":"[email protected]",
"sex":"man",
"address":"shanghai"
}
]
Repository 对 Feature/CompletableFuture 异步返回结果的支持:
@Async
Future<User> findByFirstname(String firstname); (1)
@Async
CompletableFuture<User> findOneByFirstname(String firstname); (2)
@Async
ListenableFuture<User> findOneByLastname(String lastname);(3)
- 第一处:使用 java.util.concurrent.Future 的返回类型;
- 第二处:使用 java.util.concurrent.CompletableFuture 作为返回类型;
- 第三处:使用 org.springframework.util.concurrent.ListenableFuture 作为返回类型。
- 在实际工作中,直接在 Repository 这一层使用异步方法的场景不多,一般都是把异步注解放在 Service 的方法上面,这样的话,可以有一些额外逻辑,如发短信、发邮件、发消息等配合使用;
- 使用异步的时候一定要配置线程池,这点切记,否则“死”得会很难看。
边栏推荐
- (Typora图床)阿里云oss搭建图床+Picgo上传图片详细教程
- 介绍一下实现建模中可能用到的时间序列预测之线性二次移动平均,Excel的简单操作
- 机器学习聚类——实验报告
- Code specification & explain in detail the functions and uses of husky, prettier, eslint and lint staged
- 我想知道同花顺是炒股的么?手机开户安全么?
- QT连接MySql数据查询失败
- 杜比全景音效简介
- Docker中实现MySQL主从复制
- 24 个必须掌握的数据库面试问题!
- Is it safe to open a stock account by mobile phone
猜你喜欢
Redis的最佳实践?看完不心动,算我输!!
Easyx-----c语言实现2048
9、 Beautify tables, forms, and hyperlinks
sliding window
[Beiyou orchard microprocessor design] 10 serial communication serial communication notes
(Typora图床)阿里云oss搭建图床+Picgo上传图片详细教程
QT connection MySQL data query failed
APICloud 实现文档下载和预览功能
JS take the date of the previous month 【 pit filling 】
高并发下如何防重?
随机推荐
flannel的host-gw与calico
TCP面试
有手就行的移动平均法、指数平滑法的Excel操作,用来时间序列预测
10年程序员职业生涯感悟—写给正在迷茫的你
互联网对抗神器之漏洞扫描与反渗透
一键部署属于自己的社区论坛
That is to say, "live broadcast" is launched! One stop live broadcast service with full link upgrade
Laravel admin login add graphic verification code
使用‘百家饭’自动生成API调用:JS部分进展(二)
Consumer microservice Governance Center stepping on the pit
laravel 安装报错 Uncaught ReflectionException: Class view does not exist
openresty 概述
3、 Linked list exercise
Work report (2)
Dynamic programming to solve stock problems (Part 2)
深圳市福田区支持文化创意产业发展若干措施
我想知道,十大劵商如何开户?在线开户安全么?
PC QQ大廳 上傳更新 修改versionInfo
Docker中实现MySQL主从复制
sliding window