java - Jpa 存储库查询 - java.lang.Object;不能转换为模型
问题描述
Movie
模型 :
@Entity
public class Movie {
private Long id;
private String name;
private Date releaseDate;
private List<MovieCelebrity> movieCelebrities = new ArrayList<>();
// getters & setters
}
MovieCelebrity
模型 :
@Entity
public class MovieCelebrity extends DateAudit {
private Long id;
private String characterName;
private Movie movie;
// getters & setters
}
我想在响应中返回id、name、releaseDate和characterName ,如下所示:
{
"id": 1,
"name": Scarface,
"releaseDate": 1983,
"characterName": "Tony Montana"
}
所以我做了以下查询:
@Query("SELECT m.id, m.name, m.releaseDate, mc.characterName FROM Movie m JOIN m.movieCelebrities mc " +
"WHERE mc.celebrity.id = :id AND mc.role = :role")
Page<Movie> findMoviesByCelebrity(@Param("id") Long id, @Param("role") CelebrityRole role, Pageable pageable);
但我在响应中收到以下错误:
“java.base/[Ljava.lang.Object; 不能转换为 com.movies.mmdb.model.Movie”
有一种解决方案可以在电影中使用我需要返回的参数创建构造函数并进行如下查询:
@Query("SELECT new Movie(m.id, m.name, m.releaseDate, mc.characterName) FROM...)
但由于characterName在不同的模型中,我无法制作这样的构造函数。
解决方案
带有 NEW 的构造函数表达式只能与 DTO(数据传输对象)一起使用。
但解决方案要简单得多。只需像这样返回电影:
@Query("SELECT m FROM Movie m JOIN m.movieCelebrities mc " +
"WHERE mc.celebrity.id = :id AND mc.role = :role")
Page<Movie> findMoviesByCelebrity(@Param("id") Long id, @Param("role") CelebrityRole role, Pageable pageable);
或者,如果您想使用 DTO:
@Query("SELECT NEW your.package.MovieDTO(m.id, m.name, m.releaseDate, mc.characterName) FROM Movie m JOIN m.movieCelebrities mc " +
"WHERE mc.celebrity.id = :id AND mc.role = :role")
Page<MovieDTO> findMoviesByCelebrity(@Param("id") Long id, @Param("role") CelebrityRole role, Pageable pageable);
MovieDTO 必须具有一个构造函数,该构造函数从具有匹配类型的查询中获取所有参数。
推荐阅读
- java - Android Studio FutureTask 在 for 循环中只执行一次
- botframework - 虚拟助手机器人是否需要自定义技能?还是在虚拟助手机器人本身中实现它?
- php - Composer PSR-4 自动加载接口弃用通知
- java - 使用默认值创建 ZonedDateTime 值会导致 DateTimeParseException
- ios - 应用从 News API (Swift) 加载同一篇文章的重复
- c++ - 即使重读后 Gnuplot 也无法正确更新
- c# - 在 C# 中实现忽略大小写字典的最优化方法是什么
- data-modeling - 如何在 Silverstripe 4.x 的网格字段中显示动态非 DataObject 数据?
- java - 以编程方式替换 JAR 中的 MANIFEST.MF 文件
- java - 爪哇。程序计算用户在数组中输入的 7 个数字的出现次数