MIEMBRO en EJB QL-3 no funciona
Pregunta
Me gustaría recuperar muchos 'acceso', que tiene un 'papel' en común.
Es la consulta con nombre:
SELECT access
FROM Access AS access
WHERE :role MEMBER OF access.listRole
La Acceso la entidad
public class Access implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
private String name;
private String libelle;
@ManyToOne
private Module oneModule;
@ManyToMany
private List<Role> listRole;
/* Setter & Getter */
}
La Función: la entidad
public class Role implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
private String name;
private String description;
@Enumerated(EnumType.STRING)
private Flag oneFlag;
@Transient
private int lengthAccess;
@OneToMany(mappedBy="oneRole")
private List<UserAccount> listUserAccount;
@ManyToMany
private List<Access> listAccess;
/* Geter & Setter */
}
Pero no lo logro hacer el EJB-QL derecho!
Configuración:
- EJB 3
- MySQL (InnoDB)
- jBoss
- Plop
Gracias.
Solución 2
Mi enlace @ManyToMany entre mis dos clases no se escribir de la manera correcta, durante la construcción del proyecto, 2 Tablas ha creado en MySQL ( "access_role" para mi enlace @ManyToMany en la clase de 'acceso', y para role_access @ManyToMany mi enlace en la categoría de 'papel')
Por lo tanto, para corregir esto, modificada, como
public class Access implements Serializable {
// ...
@ManyToMany(mappedBy="listAccess")
private List<Role> listRole;
// ...
}
public class Role implements Serializable {
// ...
@ManyToMany
@JoinTable(name = "access_role",
joinColumns = @JoinColumn(name = "role_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name = "access_id", referencedColumnName = "id"))
private List<Access> listAccess;
// ...
}
Otros consejos
No puedo reproducir el problema. Cuando se ejecuta la consulta JPQL que ya ha proporcionado, de esta manera:
String qlString = "SELECT access " +
"FROM Access AS access " +
"WHERE :role MEMBER OF access.listRole";
Role role = new Role();
role.setId(1L);
List accesses = session.createQuery(qlString).setParameter("role", role).list();
Hibernate genera la siguiente consulta SQL para mí (he simplificado un poco sus entidades mediante la eliminación de algunos atributos):
select
access0_.id as id127_,
access0_.libelle as libelle127_,
access0_.name as name127_
from
Access access0_
where
? in (
select
role2_.id
from
Access_ROLES listrole1_,
ROLES role2_
where
access0_.id=listrole1_.Access_id
and listrole1_.listRole_id=role2_.id
)
Todo parece correcta (probado con Hibernate Core 3.3.0.SP1, Hibernate Anotaciones 3.4.0.GA, Hibernate EM 3.4.0.GA)
¿Qué versión de Hibernate (Core, anotaciones EntityManager) ¿Está utilizando exactamente? ¿Qué error se puede conseguir exactamente? Se puede mostrar cómo se invoca la consulta?