使用 JPQL 查詢 List<User> users,直接序列化為 JSON 回傳時頻繁報錯(循環引用、LazyInitializationException、字段過多)。
UserDTO,僅包含前端需要的字段。SELECT new com.xxx.dto.UserDTO(u.id, u.name, u.email) FROM User u ... 直接投影,避免加載完整實體。List<UserDTO>,Spring MVC 自動委派 Jackson 序列化。// DTO
public class UserDTO {
private Long id;
private String name;
private String email;
// getter/setter + 建構子
}
// Repository
@Query("SELECT new com.xxx.dto.UserDTO(u.id, u.name, u.email) FROM User u WHERE u.name = :name")
List<UserDTO> findByName(@Param("name") String name);
// Controller
@GetMapping("/users")
public List<UserDTO> getUsers(@RequestParam String name) {
return userRepository.findByName(name);
}
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})。@JsonIgnore 或 @JsonManagedReference/@JsonBackReference。spring.jackson.serialization.fail-on-empty-beans=false 允許空 Bean。僅作為學習參考:重寫 User.toString() 輸出 JSON 格式,再 list.toString() 獲得數組字符串,但極易出現轉義錯誤、效能差,生產環境嚴禁使用。