簡體   English   中英

Java Hibernate獲取所有實體

[英]Java hibernate get all Entities

我有兩個Java Hibernate實體useruserPick

@Entity
@Table(name="users")
public class User{

  @Column(length=50)
  private String name;

  @OneToMany
  private List<UserPick> userPicks = new ArrayList<UserPick>(0);
  ...   

@Entity
@Table(name="usersPicks")
public class UserPick {
  ...
  User user; // this line no exist in code 
             // I want get it when load all picks
             // I am confused here or I can do it, because in user is
             // List<userPick> and it sounds like circle
             // user.getUserPicks().getUser().getUserPicks()....  
  ...

當我加載用戶一切正常。

public User findByUserName(String name) {

    Criteria criteria = session.createCriteria(User.class);
    criteria.add(Restrictions.eq("name",name));

    List<User> users = criteria.list();

    if (users.size() > 0) {
        return users.get(0);
    } else {
        return null;
    }

}

但是,我看這樣我怎么能得到所有usersPick's一個列表,並獲得選秀權的用戶,是這樣的:

public List<UserPick> getAllPicks(){
   Criteria criteria = session.createCriteria(UserPick.class);
   List<UserPick> picks = criteria.list();
   return picks;
}

我想打印選擇用戶名System.out.print(picks.get(0).getUser().getName())

可以在UserPick中與User建立關聯。 關聯UserUserPick外鍵fk_userUserPick ,請添加mappedBy = "user"User ,並關聯User的懶惰UserPick 要指定外鍵列名稱,您需要@JoinnColumn(name = "fk_user")

@Entity
@Table(name="users")
public class User{

  @Column(length=50)
  private String name;

  @OneToMany(mappedBy = "user")
  private List<UserPick> userPicks = new ArrayList<UserPick>();

}

@Entity
@Table(name="usersPicks")
public class UserPick {

  @ManyToOne(fetch = FetchType.LAZY)
  @JoinnColumn(name = "fk_user") 
  private User user;

}

而且,您可以通過@StanislavL建議的方式來獲取用戶(除非您不需要為user創建別名)

public List<UserPick> getAllPicks(){
   Criteria criteria = session.createCriteria(UserPick.class)
       .setFetchMode("user", FetchMode.JOIN);
   return criteria.list();
}

即使UserPick中與User的關聯不是惰性的,這也不是問題,因為Hibernate使用緩存將同一User設置為所有用戶的UserPick

criteria.setFetchMode("user", FetchMode.JOIN)
.createAlias("user", "user")

FetchMode.JOIN應該解決n + 1個查詢問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM