在使用 HQL 進行投影查詢時,若查詢結果包含關聯實體(外鍵),且構造函數參數順序與查詢字段順序不一致,極易觸發空指針異常。本文分析原因並給出正確寫法。
假設實體關係:
Food 表含外鍵 businessId、typeBusiness 表含字段 nameType 表含字段 name在 Food 類中定義構造函數:
public Food(Business business, String name) { ... }
HQL 查詢:
select new Food(business, name) from Food where foodid=1
報錯: 空指針異常。原因是 Business 實體中也有 name 字段,Hibernate 無法區分是查詢 Food.name 還是 Business.name,導致參數綁定錯誤。
select new Food(f.business, f.name) from Food f where f.foodid=1
錯誤:
select new Food(name, business, type) from Food where foodid=1
正確:
select new Food(f.name, f.business, f.type) from Food f where f.foodid=1
核心原則: 只要查詢涉及關聯實體且目標實體存在同名字段,務必為主表起別名並顯式前綴,避免字段名衝突導致參數綁定錯誤。