Hibernate中的字段映射中的Fetch有两种方式:EAGER和LAZYhtml
Eager:所有抓取数据库
Lazy:延迟抓取session
若是在字段中声明为Eager,那么在取得当前Bean时,同时会抓取Bean中的关联Bean值。即数据库查询屡次。反之Lazy则在以后抓取提交查询。app
好比,有以下声明为Eager的User Bean:fetch
@OneToMany(mappedBy="user", cascade=CascadeType.ALL, fetch=FetchType.EAGER) private Set<UserCard> cards;
此时使用Join查询时,将会同时把User bean下的cards均一同查询出来:spa
// ---------------------------------------------------- // 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:code
@OneToMany(mappedBy="user", cascade=CascadeType.ALL, fetch=FetchType.LAZY) private Set<UserCard> cards;
查询:htm
// ----------------------------------------------------
// 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";