JPA 多对一查询检索太多字段

问题描述 投票:0回答:1

我在 Java JPA 上有相同的模型:

@Entity
@Getter
@NoArgsConstructor
@Table(name = "review")
public class Review {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Integer id;

    @ManyToOne
    @JoinColumn(name = "user_id", referencedColumnName = "id")
    private User user;

    @ManyToOne
    @JoinColumn(name = "game_id", referencedColumnName = "id")
    private Game game;

    @Column(name = "review_text", length = 1000)
    private String review_text;

    @Column(name = "summary")
    private String summary;

    @Column(name = "likes")
    private Integer likes;

    @Column(name = "rating")
    private Integer rating;

    @Column(name = "createdAt")
    @CreationTimestamp
    @Temporal(TemporalType.TIMESTAMP)
    private Date createdAt;

我已经完成了这个端点:

@GetMapping("/ofgame/{gameId}")
public List<Review> getReviewsByGame(@PathVariable Integer gameId) {
    List<Review> reviews = new ArrayList<>();
    if (this.gameRepository.findById(gameId).isPresent()) {
        reviews = this.reviewRepository.findAllByGameId(gameId);
    }
    return reviews;
}

下一个是存储库的方法:

List<Review> findAllByGameId(Integer gameId);

但我的问题是,当我认为只返回 user_id 和 game_id 时,查询返回了 Game 和 User 的所有字段(包括编码密码)。

我对 JPA 映射的理解有误吗?或者只是有些东西我没有添加?

java hibernate jpa spring-data-jpa
1个回答
0
投票

我终于明白了,这主要是因为对 JPA 映射的误解,但最终的解决方案是使用我想要的确切字段创建 DTO(数据传输对象),然后更改自定义查询。

我的审核实体的 DTO:

@Getter
public class ReviewDTO {
    private Integer id;
    private Integer userId;
    private Integer gameId;
    private String review_text;
    private String summary;
    private Integer likes;
    private Integer rating;
    private Date createdAt;

    public ReviewDTO(Integer id, Integer userId, Integer gameId, String reviewText, String summary, Integer likes, Integer rating, Date createdAt) {
        this.id = id;
        this.userId = userId;
        this.gameId = gameId;
        this.review_text = reviewText;
        this.summary = summary;
        this.likes = likes;
        this.rating = rating;
        this.createdAt = createdAt;
    }
}

使用新查询查看存储库:

@Repository
public interface ReviewRepository extends JpaRepository<Review, Integer> {
    @Query("SELECT new com.lobby.app.model.ReviewDTO(r.id, r.user.id, r.game.id, r.review_text, r.summary, r.likes, r.rating, r.createdAt) " +
            "FROM Review r WHERE r.game.id = :gameId")
    List<ReviewDTO> findReviewsByGameId(@Param("gameId") Integer gameId);
}
© www.soinside.com 2019 - 2024. All rights reserved.