Hibernate中的字段映射中的Fetch有兩種方式:EAGER和LAZY
Eager:全部抓取
Lazy:延遲抓取
如果在字段中聲明為Eager,那么在取得當前Bean時,同時會抓取Bean中的關聯Bean值。即數據庫查詢多次。反之Lazy則在之后抓取提交查詢。
比如,有如下聲明為Eager的User Bean:
@OneToMany(mappedBy="user", cascade=CascadeType.ALL, fetch=FetchType.EAGER) private Set<UserCard> cards;
此時使用Join查詢時,將會同時把User bean下的cards均一同查詢出來:
// ---------------------------------------------------- // Left join // ---------------------------------------------------- String hql = "SELECT U FROM User U LEFT JOIN U.cards C WHERE U.userName=:userName AND C.cardID=:cardID"; Query query = session.createQuery(hql); query.setLong("cardID", 1); query.setString("userName", "Robin"); List<User> users = query.list(); for (User user : users) { System.out.println("User ID:" + user.getUserID() + "\tUser name:" + user.getUserName()); }
輸出的SQL和查詢結果:

如果把Eager修改為Lazy:
@OneToMany(mappedBy="user", cascade=CascadeType.ALL, fetch=FetchType.LAZY) private Set<UserCard> cards;
查詢:
// ----------------------------------------------------
// Left join
// ----------------------------------------------------
String hql = "SELECT U FROM User U LEFT JOIN U.cards C WHERE U.userName=:userName AND C.cardID=:cardID";
Query query = session.createQuery(hql); query.setLong("cardID", 1); query.setString("userName", "Robin"); List<User> users = query.list(); for (User user : users) { System.out.println("User ID:" + user.getUserID() + "\tUser name:" + user.getUserName()); }
輸出的SQL和查詢結果:

當然,大多數情況下,bean的設計都應該為Lazy。
因為如果真要同步查詢得到關聯對象bean的值,可以在hql中加入FETCH關鍵字即可完成。
Fetch參考例子:http://www.cnblogs.com/HD/p/3957926.html
使用FETCH,如上查詢hql可以寫為:
String hql = "SELECT U FROM User U LEFT FETCH JOIN U.cards C WHERE U.userName=:userName AND C.cardID=:cardID";
