2011-12-24 13 views
0

こんにちは
私が取り組んでいるシナリオは、twitterに似ています。私がしたいのは、hibernate criteria APIを使って、フォローしているユーザーの像を取得することです。使用
クラス:
User(この1は以下のテーブルによってマップ自体に多くの関係に多くを持っている)
Status(この1つがあることを入れて、ユーザの外部キーを持つ)
私はそれを書くことだ場合これは普通の古いSQLです。SQLクエリを休止状態に変換する条件

select * from status where status.user_id IN(select follow_id from follow where follow.user_id = 1) 

Hibernate Criteria APIを使用してこの結果を達成するにはどうすればよいですか?

@javax.persistence.Table(name = "user", uniqueConstraints = { 
     @UniqueConstraint(columnNames = "user_name")}) 
@Entity 
public class TweeUser implements Serializable { 
    private int id; 

    @javax.persistence.Column(name = "id") 
    @Id 
    @GeneratedValue 
    public int getId() { 
     return id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    private String userName; 

    @Column(name = "user_name") 
    @Basic 
    public String getUserName() { 
     return this.userName; 
    } 

    public void setUserName(String userName) { 
     this.userName = userName; 
    } 

    private String fullName; 

    @javax.persistence.Column(name = "full_name") 
    @Basic 
    public String getFullName() { 
     return fullName; 
    } 

    public void setFullName(String fullName) { 
     this.fullName = fullName; 
    } 

    private String email; 

    @javax.persistence.Column(name = "email") 
    @Basic 
    public String getEmail() { 
     return email; 
    } 

    public void setEmail(String email) { 
     this.email = email; 
    } 

    private String password; 

    @javax.persistence.Column(name = "password") 
    @Basic 
    public String getPassword() { 
     return password; 
    } 

    private Set<TweeUser> followingUsers; 

    @ManyToMany(fetch = FetchType.LAZY) 
    @JoinTable(name = "follow", joinColumns = {@JoinColumn(name = "user_id")}, inverseJoinColumns = {@JoinColumn(name = "follow_id")}, 
      uniqueConstraints = {@UniqueConstraint(columnNames = {"user_id", "follow_id"})}) 

    public Set<TweeUser> getFollowingUsers() { 
     return followingUsers; 
    } 

    public void setFollowingUsers(Set<TweeUser> followingUsers) { 
     this.followingUsers = followingUsers; 
    } 
} 

ステータスエンティティ

@javax.persistence.Table(name = "status") 
    @Entity 
    public class TweeStatus implements Serializable{ 
     private int id; 

     @javax.persistence.Column(name = "id") 
     @Id 
     @GeneratedValue 
     public int getId() { 
      return id; 
     } 

     public void setId(int id) { 
      this.id = id; 
     } 

     private String rawStatus; 

     @javax.persistence.Column(name = "raw_status") 
     @Basic 
     public String getRawStatus() { 
      return rawStatus; 
     } 

     public void setRawStatus(String rawStatus) { 
      this.rawStatus = rawStatus; 
     } 

     private Date createTime; 

     @Temporal(TemporalType.TIMESTAMP) 
     @javax.persistence.Column(name = "create_time") 
     @Basic 
     public Date getCreateTime() { 
      return createTime; 
     } 

     public void setCreateTime(Date createTime) { 
      this.createTime = createTime; 
     } 

     private TweeUser tweeUser; 

     @ManyToOne 
     @JoinColumn(name = "user_id") 
     public TweeUser getTweeUser(){ 
      return tweeUser; 
     } 

     public void setTweeUser(TweeUser tweeUser){ 
      this.tweeUser = tweeUser; 
     } 

     private Set<TweeHashTag> tweeHashTags; 

     @ManyToMany(fetch = FetchType.EAGER,cascade = CascadeType.ALL) 
     @JoinTable(name = "status_hash", joinColumns = { @JoinColumn(name = "status_id") }, inverseJoinColumns = { @JoinColumn(name = "hash_id")},uniqueConstraints = { 
      @UniqueConstraint(columnNames = { "status_id", "hash_id" }) }) 
     public Set<TweeHashTag> getTweeHashTags(){ 
      return tweeHashTags; 
     } 

     public void setTweeHashTags(Set<TweeHashTag> tweeHashTags){ 
      this.tweeHashTags = tweeHashTags; 
     } 

    } 

答えて

1

私はこの質問への答えを得たと思います。それはかなり簡単でした。だからここに行く。

Criteria criteria = session.createCriteria(TweeStatus.class); 
criteria.add(Restrictions.in("tweeUser",tweeUser.getFollowingUsers())); 
List statuses = criteria.list(); 
1

あなたはあなたのエンティティのコードを提供することができませんでした。あなたがそうしたら、多分あなたを助けることができます。 私の最初の考えは、Entityに@ManyToMany関係を持たせることは、一般的には良い考えではないということです。 私の最初の提案は、この記事を見て、多分あなたのデシベルのデザインを再考することです:

How to define many-to-many to itself in JPA?

+0

私はソースを追加しました。さて、私はすでにUserエンティティでいくつかの操作を行っています。だから私はデザインを変更することができるか分からない。しかし、私はそれについても見ていきます。あなたが私に何をしなければならないかを私に指摘できれば嬉しいです。 – sYl3r