我对React式存储库和webflux还不熟悉。我正在从数据库中获取一个数据列表,并使用 map()
要构建dto类对象,在此过程中,我需要运行另一个查询来获取计数值并更新相同的dto对象。当我尝试如下操作时,计数被设置为空
@Repository
public class CandidateGroupCustomRepo {
public Flux<CandidateGroupListDTO> getList(BigInteger userId){
final String sql = "SELECT gp.CANDIDATE_GROUP_ID,gp.NAME ,gp.GROUP_TYPE \n" +
" ,gp.CREATED_DATE ,cd.DESCRIPTION STATUS ,COUNT(con.CANDIDATE_GROUP_ID)\n" +
" FROM ........" +
" WHERE gp.CREATED_BY_USER_ID = :userId GROUP BY gp.CANDIDATE_GROUP_ID,gp.NAME ,gp.GROUP_TYPE \n" +
" ,gp.CREATED_DATE ,cd.DESCRIPTION";
return dbClient.execute(sql)
.bind("userId", userId)
.map(row ->{
CandidateGroupListDTO info = new CandidateGroupListDTO();
info.setGroupId(row.get(0, BigInteger.class));
info.setGroupName(row.get(1, String.class)) ;
info.setGroupType(row.get(2, String.class));
info.setCreatedDate( row.get(3, LocalDateTime.class));
info.setStatus(row.get(4, String.class));
if(info.getGroupType().equalsIgnoreCase("static")){
info.setContactsCount(row.get(5, BigInteger.class));
}else{
getGroupContactCount(info.getGroupId()).subscribe(count ->{
System.out.println(">>>>>"+count);
info.setContactsCount(count);
});
}
return info;
}
)
.all() ;
}
Mono<BigInteger> getGroupContactCount(BigInteger groupId){
final String sql = "SELECT 3 WHERE :groupId IS NOT NULL;";
return dbClient.execute(sql)
.bind("groupId", groupId)
.map(row -> {
System.out.println(row.get(0, BigInteger.class));
return row.get(0, BigInteger.class);
} ).one();
}
}
当我打电话的时候 getGroupContactCount
,我正在尝试从 Mono<BigInteger>
把它放在我的dto里。。。。sys out正确地打印了count值,但响应中count仍然为null。
1条答案
按热度按时间1wnzp6jl1#
你在打电话吗
subscribe
在中间,这反过来又基本上是阻塞。订阅的用户通常是最终用户,我猜您的spring应用程序不是,最有可能的最终用户是发起调用的网页。你的服务器是生产商。打电话给数据库,
flatMap
然后回来。使用
map
如果顺序重要,否则尝试使用flatMap
做异步工作。