Hibernate Criteria Join con otro campo

Mi problema es que tengo que realizar este query con Criteria y no se como hacerlo

select *
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:

List<Permisos_Usuarios> lista = sesion.createCriteria(Permisos_Usuarios.class, "pu")
                    .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

Exception in thread "AWT-EventQueue-0" org.hibernate.QueryException: could not resolve property: grupo_roles of: entidades.Seguridad.Permisos_Usuarios

Clase de Mapeo de Grupo_Roles:

<hibernate-mapping>
    <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

<hibernate-mapping>
    <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:

<hibernate-mapping>
    <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;
    }

}

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

Resuelto!!!

Como no pude especificar esto:

join seguridad.grupo_roles gr on gr.idgrupo_permiso = pu.idgrupo_permiso

en Hibernate Criteria

 .createAlias("pu.grupo_roles", "gr")

Realice una sub-consulta en el cual puedo igualar los campos que se relacionan entre si en esas dos tablas

DetachedCriteria query = DetachedCriteria.forClass(Grupo_Roles.class, "gr")
                    .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();

Imagen de Nopalin

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:

List<Permisos_Usuarios> lista = sesion.createCriteria(Permisos_Usuarios.class, "pu")
    .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