2009-06-04 20 views
9

He creado dos granos de usuario y VirtualDomain con muchos a muchoscómo escribir consulta de unión en hibernación

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

cómo obtener los datos de usuario, como nombre de usuario relacionada con el dominio particular a través de hibernación.

Respuesta

10

Para agregar a la respuesta de gid, si por alguna razón necesita buscar ansiosamente las relaciones de una entidad, la sintaxis de unión sería una búsqueda conjunta.

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

hola Blake. por favor, ayúdenme Cuando utilicé esta consulta me está dando el error java.lang.NoSuchMethodError: org.hibernate.hql.antlr.HqlBaseParser.recover (Lantlr/RecognitionException; Lantlr/collections/impl/BitSet;) V – Jugal

+0

I ' Si editó la consulta, no debería haber ningún Usuario en la consulta. –

+0

su consulta editada parece correcta, pero solo quiero el campo de nombre de usuario, así que cuando agrego una cláusula de selección como, por ejemplo, seleccione u.nombre de usuario, me da el error org.hibernate.QueryException: búsqueda especificada de unión, pero el propietario de la asociación obtenida no presente en la lista de selección – Jugal

2

Siempre differcult HQL TODO con un sistema de prueba ... pero aquí vamos:

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

quiero saber cómo le va.

Un consejo que solía hacer antes de comprar Intellji era detener la aplicación en el depurador y luego usar la ventana inmediata para experimentar con HQL.

El hibernate documentation en las uniones siempre ha sido un poco críptico en mi opinión.

+0

Gracias, pero no puedo entender tha última condición v.name como 'foo%' – Jugal

+0

Ese es el mismo tipo de cláusula como la que se encuentra en SQL. http://www.sql-tutorial.net/SQL-LIKE.asp –

+0

acaba de corregir el error tipográfico. como Blake dice que la cláusula similar es la misma que la SQL –

Cuestiones relacionadas