Hibernate Criteria Join con otro campo
Mi problema es que tengo que realizar este query con Criteria y no se como hacerlo
from seguridad.permisos_usuarios pu
join seguridad.grupo_roles gr on gr.idgrupo_permiso = pu.idgrupo_permiso
join seguridad.usuarios u on gr.idusuario = u.idusuario
join seguridad.grupos_permisos gp on gp.idgrupo_permiso = gr.idgrupo_permiso
join configuracion.empresas e on e.idempresa = gr.idempresa
join seguridad.rol r on r.idrol = pu.idrol
where u.idusuario = 1
and e.idempresa = 1
and r.idrol = 1
En Java tengo esto:
.createAlias("pu.grupo_roles", "gr")
.createAlias("pu.grupo_permiso", "gp")
.createAlias("gr.usuarios", "u")
.createAlias("gp.empresa", "e")
.createAlias("pu.rol", "r")
.createAlias("r.modulo", "m")
.add(Restrictions.eq("e.empresa", empresa))
.add(Restrictions.eq("u.usuario", usuario))
.add(Restrictions.eq("r.rol", 1))
.list();
Este es el problema que me muestra porque esta buscando la llave primaria idgrupo_roles pero en realidad mi relacion no es con el primary key sino con la llave foranea idgrupo_permiso
Clase de Mapeo de Grupo_Roles:
<class name="entidades.Seguridad.Grupo_Roles" table="grupo_roles" schema="seguridad">
<id column="idgrupo_roles" name="idgrupo_roles">
</id>
<many-to-one cascade="save-update" class="entidades.Seguridad.Grupos_Permisos" column="idgrupo_permiso" fetch="select" name="grupo_permiso">
</many-to-one>
<many-to-one cascade="save-update" class="entidades.Seguridad.Usuarios" column="idusuario" fetch="select" name="usuario">
</many-to-one>
<many-to-one cascade="save-update" class="entidades.Configuracion.Empresas" column="idempresa" fetch="select" name="empresa">
</many-to-one>
</class>
</hibernate-mapping>
Clase de Mapeo Permisos_Usuarios
<class name="entidades.Seguridad.Permisos_Usuarios" table="permisos_usuarios" schema="seguridad">
<id column="idpermiso_usuario" name="idpermiso_usuario">
</id>
<many-to-one cascade="save-update" class="entidades.Seguridad.Grupos_Permisos" column="idgrupo_permiso" fetch="select" name="grupo_permiso">
</many-to-one>
<many-to-one cascade="save-update" class="entidades.Seguridad.Rol" column="idrol" fetch="select" name="rol">
</many-to-one>
<property name="nuevo"/>
<property name="editar"/>
<property name="eliminar"/>
<property name="buscar"/>
<property name="imprimir"/>
<property name="estado"/>
</class>
</hibernate-mapping>
Clase de Mapeo Grupos_Permisos:
<class name="entidades.Seguridad.Grupos_Permisos" table="grupos_permisos" schema="seguridad">
<id column="idgrupo_permiso" name="idgrupo_permiso">
</id>
<property name="codigo"/>
<property name="grupo_permiso"/>
<many-to-one cascade="save-update" class="entidades.Configuracion.Empresas" column="idempresa" fetch="select" name="empresa">
</many-to-one>
<set fetch="select" inverse="true" lazy="true" name="grupo_roles" table="grupo_roles">
<key>
<column name="idgrupo_permiso"/>
</key>
<one-to-many class="entidades.Seguridad.Grupo_Roles"/>
</set>
<set fetch="select" inverse="true" lazy="true" name="permisos_usuarios" table="permisos_usuarios">
<key>
<column name="idgrupo_permiso"/>
</key>
<one-to-many class="entidades.Seguridad.Permisos_Usuarios"/>
</set>
</class>
</hibernate-mapping>
Clase de Grupo_Roles:
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package entidades.Seguridad;
import entidades.Configuracion.Empresas;
import java.io.Serializable;
public class Grupo_Roles implements Serializable{
long idgrupo_roles;
Grupos_Permisos grupo_permiso;
Usuarios usuario;
Empresas empresa;
public Grupo_Roles() {
}
public Grupo_Roles(Grupos_Permisos grupo_permiso, Usuarios usuario,Empresas empresa) {
this.grupo_permiso = grupo_permiso;
this.usuario = usuario;
this.empresa = empresa;
}
public long getIdgrupo_roles() {
return idgrupo_roles;
}
public void setIdgrupo_roles(long idgrupo_roles) {
this.idgrupo_roles = idgrupo_roles;
}
public Grupos_Permisos getGrupo_permiso() {
return grupo_permiso;
}
public void setGrupo_permiso(Grupos_Permisos grupo_permiso) {
this.grupo_permiso = grupo_permiso;
}
public Usuarios getUsuario() {
return usuario;
}
public void setUsuario(Usuarios usuario) {
this.usuario = usuario;
}
public Empresas getEmpresa() {
return empresa;
}
public void setEmpresa(Empresas empresa) {
this.empresa = empresa;
}
}
Clase Grupos_Permisos
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package entidades.Seguridad;
import entidades.Configuracion.Empresas;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
public class Grupos_Permisos implements Serializable{
long idgrupo_permiso;
long codigo;
String grupo_permiso;
Empresas empresa;
private Set grupo_roles = new HashSet(0);
private Set permisos_usuarios = new HashSet(0);
public Grupos_Permisos() {
}
public Grupos_Permisos(String grupo_permiso, Empresas empresa) {
this.grupo_permiso = grupo_permiso;
this.empresa = empresa;
}
public long getIdgrupo_permiso() {
return idgrupo_permiso;
}
public void setIdgrupo_permiso(long idgrupo_permiso) {
this.idgrupo_permiso = idgrupo_permiso;
}
public long getCodigo() {
return codigo;
}
public void setCodigo(long codigo) {
this.codigo = codigo;
}
public String getGrupo_permiso() {
return grupo_permiso;
}
public void setGrupo_permiso(String grupo_permiso) {
this.grupo_permiso = grupo_permiso;
}
public Empresas getEmpresa() {
return empresa;
}
public void setEmpresa(Empresas empresa) {
this.empresa = empresa;
}
public Set getGrupo_roles() {
return grupo_roles;
}
public void setGrupo_roles(Set grupo_roles) {
this.grupo_roles = grupo_roles;
}
public Set getPermisos_usuarios() {
return permisos_usuarios;
}
public void setPermisos_usuarios(Set permisos_usuarios) {
this.permisos_usuarios = permisos_usuarios;
}
@Override
public String toString() {
return grupo_permiso;
}
}
Clase Permisos_Usuarios:
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package entidades.Seguridad;
public class Permisos_Usuarios {
long idpermiso_usuario;
Grupos_Permisos grupo_permiso;
Rol rol;
String nuevo;
String editar;
String eliminar;
String buscar;
String imprimir;
String estado;
public Permisos_Usuarios() {
}
public Permisos_Usuarios(Grupos_Permisos grupo_permiso, Rol rol, String nuevo, String editar, String eliminar, String buscar, String imprimir, String estado) {
this.grupo_permiso = grupo_permiso;
this.rol = rol;
this.nuevo = nuevo;
this.editar = editar;
this.eliminar = eliminar;
this.buscar = buscar;
this.imprimir = imprimir;
this.estado = estado;
}
public long getIdpermiso_usuario() {
return idpermiso_usuario;
}
public void setIdpermiso_usuario(long idpermiso_usuario) {
this.idpermiso_usuario = idpermiso_usuario;
}
public Grupos_Permisos getGrupo_permiso() {
return grupo_permiso;
}
public void setGrupo_permiso(Grupos_Permisos grupo_permiso) {
this.grupo_permiso = grupo_permiso;
}
public Rol getRol() {
return rol;
}
public void setRol(Rol rol) {
this.rol = rol;
}
public String getNuevo() {
return nuevo;
}
public void setNuevo(String nuevo) {
this.nuevo = nuevo;
}
public String getEditar() {
return editar;
}
public void setEditar(String editar) {
this.editar = editar;
}
public String getEliminar() {
return eliminar;
}
public void setEliminar(String eliminar) {
this.eliminar = eliminar;
}
public String getBuscar() {
return buscar;
}
public void setBuscar(String buscar) {
this.buscar = buscar;
}
public String getImprimir() {
return imprimir;
}
public void setImprimir(String imprimir) {
this.imprimir = imprimir;
}
public String getEstado() {
return estado;
}
public void setEstado(String estado) {
this.estado = estado;
}
}
- Inicie sesión o regístrese para enviar comentarios
Resuelto!!!
Como no pude especificar esto:
en Hibernate Criteria
Realice una sub-consulta en el cual puedo igualar los campos que se relacionan entre si en esas dos tablas
.createAlias("gr.empresa", "e")
.createAlias("gr.usuario", "u")
.setProjection(Property.forName("gr.grupo_permiso"))
.add(Property.forName("gr.grupo_permiso").eqProperty("pu.grupo_permiso"))
.add(Restrictions.eq("e.empresa", empresa))
.add(Restrictions.eq("u.usuario", usuario));
lista = sesion.createCriteria(Permisos_Usuarios.class, "pu")
.createAlias("pu.rol", "r")
.add(Restrictions.eq("r.rol", rol))
.add(Subqueries.exists(query)).list();
Si vas a utilizar criteria
Si vas a utilizar criteria api de hibernate, debes de dejar de pensar el query al que quieres llegar y pensar en como buscar objetos.
Tu estas definidiendo esto:
.createAlias("pu.grupo_roles", "gr")
...
Lo que significa que el objeto Pemisos_Usuarios debe tener una propiedad llamada grupo_roles que tambien debe ser una entidad, y en tu entidad no existe tal propiedad, ese es el problema.
Saludos