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.

¿Fue útil?

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?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top