Hibernate 的 filter 功能允許在已載入的持久化集合上執行 HQL 查詢,直接篩選出符合條件的子集合,避免在記憶體中手動迭代過濾。本文以 Picgroup 與 images 一對多關聯為例,示範如何只取出 state='C' 的圖片。
String hql = "select p from Picgroup p join p.images t where p.id=" + groupId;
Query query = session.createQuery(hql);
List list = query.list();
Picgroup group = (Picgroup) list.get(0);
view.setName(group.getName());
view.setId(groupId);
// 關鍵行:對 group.getImages() 進行過濾
Collection image = session.filter(group.getImages(),
"select this where this.state='C'");
Iterator ite = image.iterator();
// 後續處理符合條件的 image 集合
session.filter(collection, queryString):第一參數為已持久化的集合,第二參數為 HQL 片段,this 代表集合元素本身。善用 Hibernate 的集合過濾,能寫出更簡潔、高效的資料存取程式碼,是處理關聯集合查詢的利器。