首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

JPA 查詢多條 User 實體並轉 JSON 回傳前端最佳實踐

     編輯:程式設計疑難解答

問題場景

使用 JPQL 查詢 List<User> users,直接序列化為 JSON 回傳時頻繁報錯(循環引用、LazyInitializationException、字段過多)。

推薦方案:DTO + Jackson

  1. 定義精簡的 UserDTO,僅包含前端需要的字段。
  2. 查詢時使用 SELECT new com.xxx.dto.UserDTO(u.id, u.name, u.email) FROM User u ... 直接投影,避免加載完整實體。
  3. Controller 直接返回 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。

手工拼 JSON(不推薦)

僅作為學習參考:重寫 User.toString() 輸出 JSON 格式,再 list.toString() 獲得數組字符串,但極易出現轉義錯誤、效能差,生產環境嚴禁使用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved