如何用DTO从mono和flux在春季反应性webflux中制作新的mono



在这里,我尝试从数据库进行调用,并将不同的mono和flux组合成新的mono。

public Mono<ListMovieWithKomenDTO> fetchMovieAndKomen(Integer movieId){
Mono<Movie> movie = findById(movieId).subscribeOn(Schedulers.elastic());
Flux<MovieKomen> movieKomen = getKomenByMovieId(movieId).subscribeOn(Schedulers.elastic());
return Mono.zip(movie, movieKomen.collectList(), movieMovieKomenDTOBiFunction);
}
private BiFunction<Movie, List<MovieKomen>, ListMovieWithKomenDTO> movieMovieKomenDTOBiFunction = (x1, x2) -> ListMovieWithKomenDTO.builder()
// .age(x1.getAge())
.id(x1.getId())
.name(x1.getName())
.status(x1.getStatus())
.detail(x1.getDetail())
.url(x1.getUrl())
.movieKomen(x2).build();

在这里,我对标题(如电影(和细节(如电影评论(进行了两次db调用,以将它们分开。在我检索了两个不同的数据后,我想加入基于通量数据和mono的新mono数据。为了把它们变成一个数据,我从电影表和评论表中制作了DTO,但失败了。我假设mono.zip中的错误将数据放入一个新的mono中。

这里是来自调试控制台的错误

java.lang.IllegalArgumentException: Cannot encode parameter of type org.springframework.r2dbc.core.Parameter
at io.r2dbc.postgresql.ExtendedQueryPostgresqlStatement.bind(ExtendedQueryPostgresqlStatement.java:89) ~[r2dbc-postgresql-0.8.10.RELEASE.jar:0.8.10.RELEASE]

谢谢

问题出现在我的存储库中,我使用了

public interface MovieKomenRepository  extends ReactiveCrudRepository<MovieKomen,Integer> {
@Query("select * from m_movie_komen where m_movie_id = $1")
Flux<MovieKomen> findByMovieId(int movie_id);
}

在上面的例子中,我在查询中使用了$1作为参数。但当我像底部一样更改代码时。它就像一个符咒。

public interface MovieKomenRepository  extends ReactiveCrudRepository<MovieKomen,Integer> {
@Query("select * from m_movie_komen where m_movie_id = :movie")
Flux<MovieKomen> findByMovieId(@Param("movie") int movie_id);
}

因此,如果有人想使用我的服务代码,在存储库中很好,但要小心。我们不应该用"$1"代替":movie"。因此问题不在服务中或单/通量。但是在我的仓库

谢谢。

最新更新