使用 session.get(String.class, "1-1001") 查詢,明確資料庫有資料,但回傳 null。
"1-1001" vs 查詢值:"1-1001 " (含空白)"A-1001" vs 查詢 "a-1001" (視資料庫 Collation)CHAR(10) 固定長度,實際儲存 "1-1001 " (右填空格)SELECT * FROM student WHERE id = '1-1001'; -- 直接在資料庫執行確認
@Id 註解缺失或標註錯誤欄位@Table(name="student") 表名不符 (大小寫、schema)@Column(name="id") 欄位名不符@EmbeddedId / @IdClass@Entity
@Table(name = "student") // 確認表名
public class Student {
@Id
@Column(name = "id", length = 20) // 確認欄位名、長度
private String id;
// getter/setter...
}
session.get() 需在開啟的 Session 中執行session.clear() 或關閉二級快取測試deleted=1)、過濾條件攔截# logback.xml / log4j2.xml
<logger name="org.hibernate.SQL" level="DEBUG"/>
<logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE"/>
觀察實際執行 SQL 與參數值。
String sql = "SELECT * FROM student WHERE id = ?";
Student student = session.createNativeQuery(sql, Student.class)
.setParameter(1, "1-1001")
.uniqueResult();
session.clear(); // 清除一級快取
session.getSessionFactory().getCache().evictAllRegions(); // 清除二級快取 (需權限)
session.get() 回傳 null
↓
在資料庫直接執行 SELECT 確認資料存在?
├── 否 → 資料真無、表名錯、權限問題
└── 是 → 複製資料庫實際主鍵值 (含隱藏字元) 到程式查詢
↓
仍為 null?
├── 是 → 檢查 @Entity/@Id/@Table/@Column 映射
│ ↓
│ 映射正確?
│ ├── 否 → 修正映射
│ └── 是 → 檢查 Session 狀態、事務、快取
└── 否 → 主鍵值格式問題 (空白、大小寫、編碼)
→ 程式端 trim()/標準化後再查詢