首页 > 解决方案 > 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
}

我想在响应中返回idnamereleaseDatecharacterName ,如下所示:

{
    "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.movi​​es.mmdb.model.Movie”

有一种解决方案可以在电影中使用我需要返回的参数创建构造函数并进行如下查询:

@Query("SELECT new Movie(m.id, m.name, m.releaseDate, mc.characterName) FROM...)

但由于characterName在不同的模型中,我无法制作这样的构造函数。

标签: javaspring-bootspring-data-jpaspring-rest

解决方案


带有 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 必须具有一个构造函数,该构造函数从具有匹配类型的查询中获取所有参数。


推荐阅读