2009-06-04 9 views
9

J'ai créé deux haricots et l'utilisateur virtualdomain avec plusieurs à plusieurscomment écrire se joindre à la requête dans Mise en veille prolongée

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

comment obtenir des données de l'utilisateur comme nom d'utilisateur lié au domaine particulier par mise en veille prolongée.

Répondre

10

Pour ajouter à la réponse de gid, si pour une raison quelconque vous avez besoin d'aller chercher avec impatience une relation d'entites, alors la syntaxe de jointure serait join fetch.

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

bonjour Blake. S'il vous plaît aidez-moi Lorsque j'ai utilisé cette requête, il me donne l'erreur java.lang.NoSuchMethodError: org.hibernate.hql.antlr.HqlBaseParser.recover (Lantlr/ReconnaissanceException; Lantlr/collections/impl/BitSet;) V – Jugal

+0

I ' Si vous avez modifié la requête, il ne devrait pas y avoir d'utilisateur dans la requête. –

+0

votre requête éditée semble ok mais je veux seulement le champ de nom d'utilisateur de l'utilisateur ainsi quand j'ajoute la clause select comme choisissent u.username il me donne l'erreur org.hibernate.QueryException: interrogation join join fetching, mais le propriétaire de l'association récupérée n'a pas été présent dans la liste de sélection – Jugal

2

Toujours differcult todo HQL avec un système de test ... mais ici nous allons:

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

Laissez-moi savoir comment vous allez. Un conseil que j'ai souvent fait avant d'acheter Intellji était d'arrêter l'application dans le débogueur, puis d'utiliser la fenêtre immédiate pour expérimenter HQL.

Le hibernate documentation sur les jointures a toujours été un peu cryptique à mon avis.

+0

Merci, mais je ne peux pas comprendre tha dernière condition v.name comme « foo% » – Jugal

+0

C'est le même genre de clause comme qui se trouve dans SQL. http://www.sql-tutorial.net/SQL-LIKE.asp –

+0

juste corrigé la faute de frappe. comme Blake dit que la clause like est identique à la clause SQL –

Questions connexes