休止

2009-06-04 13 views
9

でクエリに参加書くためにどのように私は、Hibernateを通じて、特定のドメインに関連したユーザー名などのユーザーのデータを取得する方法を休止

@Entity 
@Table(name = "tblUser") 
public class User implements Serializable { 
    private Long id; 
    private String username; 
    private Set<VirtualDomain> virtualdomainset; 
@Id 
@Column(name = "id") 
@GeneratedValue(strategy = GenerationType.AUTO) 
public Long getId() { 
    return id; 
} 

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

@Column(name = "username", length = 50, nullable = false) 
public String getUsername() { 
    return username; 
} 

public void setUsername(String username) { 
    this.username = username; 
} 
    @ManyToMany(targetEntity = VirtualDomain.class, cascade = {CascadeType.PERSIST},fetch=FetchType.EAGER) 
    @JoinTable(name = "tblUserDomainRel", joinColumns = @JoinColumn(name = "userid"), inverseJoinColumns = @JoinColumn(name = "domainid")) 
    public Set<VirtualDomain> getVirtualdomainset() { 
     return virtualdomainset; 
    } 

    public void setVirtualdomainset(Set<VirtualDomain> virtualdomainset) { 
     this.virtualdomainset = virtualdomainset; 
    } 

} 

@Entity 
@Table(name = "tblVirtualDomain") 
public class VirtualDomain { 
    private Long id; 
    private String domainname; 
    private Set<User> userset; 
@Id 
@JoinColumn(name = "id") 
@GeneratedValue(strategy = GenerationType.AUTO) 
public Long getId() { 
    return id; 
} 

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

@Column(name = "domain_name") 
public String getDomainname() { 
    return domainname; 
} 

public void setDomainname(String domainname) { 
    this.domainname = domainname; 
} 
@ManyToMany(cascade = {CascadeType.ALL},fetch=FetchType.EAGER, mappedBy = "virtualdomainset", targetEntity = User.class) 

public Set<User> getUserset() { 
    return userset; 
} 

public void setUserset(Set<User> userset) { 
    this.userset = userset; 
} 
} 

多くの関係に多くを持つ2つの豆ユーザーとバーチャルドメインを作成しました。

答えて

10

gidの答えに追加するには、何らかの理由でentites関係を熱心に取得する必要がある場合は、join構文をjoin fetchにします。

from VirtualDomain vd join fetch vd.usersset u 
    where vd.domainname = 'example.com' and u.username like 'foo%' 
+0

こんにちはブレイク。私を助けてください このクエリを使用すると、java.lang.NoSuchMethodErrorエラーが発生します:org.hibernate.hql.antlr.HqlBaseParser.recover(Lantlr/RecognitionException; Lantlr/collections/impl/BitSet;)V – Jugal

+0

私は、クエリを編集したが、クエリ内にユーザーがあってはいけません。 –

+0

あなたの編集したクエリは大丈夫ですが、ユーザのユーザ名フィールドのみを選択したいので、select u.usernameのようなselect句を追加するとエラーになります。org.hibernate.QueryException:クエリの結合フェッチが指定されていますが、選択リストに存在 – Jugal

2

常にdiffercult藤堂HQLとテストシステムアウト...しかし、ここで私達は行く:

select u from VirtualDomain vd join User vd.usersset u 
     where vd.domainname = 'example.com' and u.username like 'foo%' 

は私はあなたが取得する方法を知ってみましょう。

私がIntelljiを購入する前によくしたヒントは、デバッガでアプリケーションを停止して、即時ウィンドウを使用してHQLを試すことでした。

ジョインのhibernate documentationは、私の意見では常に少し謎めいています。

+0

おかげで、私はSQLで発見されたような句の同じようなものだ「のfoo%」 – Jugal

+0

のような股関節最後の条件v.nameを理解することはできません。 http://www.sql-tutorial.net/SQL-LIKE.asp –

+0

はタイプミスを修正しました。 Blakeはlike節がSQLと同じであると言っています –