2009-06-04 61 views
9

连接查询我已经创建了两个豆类用户和虚拟域中具有多对多的关系如何编写休眠

@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; 
} 
} 

如何让用户喜欢通过Hibernate与特定的域用户名的数据。

回答

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 2009-06-04 13:22:18

+0

我'已编辑查询,查询中不应该有任何用户。 – 2009-06-04 13:33:50

+0

你编辑的查询看起来不错,但我只想从用户的用户名字段,所以当我添加选择子句,如选择u.username,它给了我错误org.hibernate.QueryException:查询指定的联接提取,但获取的关联的所有者不是出现在选择列表 – Jugal 2009-06-04 13:53:06

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

谢谢,但我不明白塔最后一个条件v.name像“富%” – Jugal 2009-06-04 12:27:53

+0

这是同一种类似条款,即在SQL中。 http://www.sql-tutorial.net/SQL-LIKE.asp – 2009-06-04 12:35:01

+0

刚纠正错字。正如Blake所说的like子句与SQL一样 – 2009-06-04 12:42:54