ccms.entity.CfgUserAreeTermTree cannot be cast to ccms.entity.CfgUserAreeTermTreeId
嘗試將 實體類別 `CfgUserAreeTermTree` 的實例 強制轉型為 其主鍵類別 `CfgUserAreeTermTreeId`,兩者完全無繼承關係,屬於同包下不同類,直接導致 `ClassCastException`。
| 場景 | 錯誤代碼示例 | 正確寫法 |
|---|---|---|
| HQL 查詢返回主鍵但聲明為實體 | List | List 或 select t from ... |
| Criteria 投影錯誤 | criteria.setProjection(Projections.property("id")); List | 投影查詢返回類型為主鍵類別,不可直接轉實體 List |
| Service 層強制轉型 | CfgUserAreeTermTreeId id = (CfgUserAreeTermTreeId) entity; | 實體獲取 ID:entity.getId() |
| JSP/頁面綁定錯誤 | <c:forEach items="${list}" var="item"> ${item.id.property} </c:forEach> 但 list 實為主鍵列表 | 確認傳遞給頁面的集合泛型類型 |
// 典型複合主鍵寫法
@Entity
@IdClass(CfgUserAreeTermTreeId.class) // 或 @EmbeddedId
public class CfgUserAreeTermTree {
@Id String field1;
@Id String field2;
// ...
}
確認主鍵類別名稱拼寫完全一致。
// 錯誤
List list = session.createQuery("select t.id from CfgUserAreeTermTree t").list();
// 正確 1: 查詢完整實體
List list = session.createQuery("from CfgUserAreeTermTree").list();
// 正確 2: 僅需 ID 列表
List ids = session.createQuery("select t.id from CfgUserAreeTermTree t").list();