我在 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 映射的理解有误吗?或者只是有些东西我没有添加?
我终于明白了,这主要是因为对 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);
}