Как использовать левое соединение в jpql - PullRequest
0 голосов
/ 31 мая 2019

Привет, ребята, этот запрос работает нормально в oracle (sqldeveloper), но когда я пытаюсь использовать его в запросе с именем jpql, он выдает ошибку, я предполагаю, что он связан с тем, как я выполняю внешнее соединение, но я не совсем уверен, мне нужно внешнее соединение, чтобы иметь возможность получить MsMenu, даже если они нулевые.

Запрос сделан на оракула (рабочий):

select ac.accecodi, ac.accenomb, m.menucodi, m.menunomb from ms_usuario u, ms_grupo g, ms_gruporol gr, ms_rol r, ms_acrol ar, ms_acces ac 
left outer JOIN ms_menu m ON ac.menucodi = m.menucodi where ar.accecodi = ac.accecodi and r.rolcodi = ar.rolcodi and gr.rolcodi = r.rolcodi
and g.grupcodi = gr.grupcodi and u.grupcodi = g.grupcodi and u.usuausua='CP9991115';

Запрос на jpql (выдает ошибку):

@NamedQuery(name = MsAcceso.buscarTodosAccesoPorUsuario, query = "SELECT modelo from MsAcceso modelo, MsUsuario u, MsGrupo g, MsGrupoRol gr, MsRol r, MsAccesoRol ar"
            + " left outer JOIN MsMenu m ON modelo.msMenu.menucodi = m.menucodi where ar.msAcceso.accecodi = modelo.accecodi and r.rolcodi = ar.msRol.rolcodi and gr.msRol.rolcodi = r.rolcodi"
            + " and g.grupcodi = gr.msGrupo.grupcodi and u.msGrupo.grupcodi = g.grupcodi and u.usuausua=:usuausua")

Ошибка, которую я получаю:

Caused by: java.sql.SQLException: ORA-00904: "T12"."MENUCODI": identificador no válido

В нем говорится, что menucodi не является допустимым идентификатором, но это мой первичный ключ MsMenu в таблице, его menucodi, так что, почему я угадываю, как я выполняю внешнее левое соединение, любая помощь приветствуется.

Мой класс MsAcceso:

@Entity
@Table(name = "MS_ACCES")
@NamedQueries({
        @NamedQuery(name = MsAcceso.buscarTodosAcceso, query = "SELECT modelo from MsAcceso modelo order by modelo.accecodi asc"),
        @NamedQuery(name = MsAcceso.buscarTodosAccesoActivos, query = "SELECT modelo from MsAcceso modelo where UPPER(modelo.acceacti) = 'S' order by modelo.accecodi asc"),
        @NamedQuery(name = MsAcceso.buscarAccesoActivoPorCodigo, query = "SELECT modelo from MsAcceso modelo where modelo.accecodi=:accecodi and UPPER(modelo.acceacti) = 'S'"),
        @NamedQuery(name = MsAcceso.buscarAccesoPorCodigo, query = "SELECT modelo from MsAcceso modelo where modelo.accecodi=:accecodi"),
        @NamedQuery(name = MsAcceso.buscarAccesoPorNombre, query = "SELECT modelo from MsAcceso modelo where modelo.accenomb=:accenomb"),
        @NamedQuery(name = MsAcceso.buscarTodosAccesoActivosPorPrograma, query = "SELECT a from MsAcceso a, MsPrograma p"
                + " where" + " UPPER(a.acceacti)='S' " + " and a.msPrograma.progcodi = p.progcodi "
                + "and p.prognomb=:prognomb order by a.accecodi asc"),
        @NamedQuery(name = MsAcceso.buscarTodosAccesoPorPrograma, query = "SELECT a from MsAcceso a, MsPrograma p"
                + " where" + " a.msPrograma.progcodi = p.progcodi "
                + "and p.prognomb=:prognomb order by a.accecodi asc"),
        @NamedQuery(name = MsAcceso.buscarTodosAccesoPorUsuario, query = "SELECT modelo from MsAcceso modelo, MsUsuario u, MsGrupo g, MsGrupoRol gr, MsRol r, MsAccesoRol ar"
                + " left outer JOIN MsMenu m ON modelo.msMenu.menucodi = m.menucodi where ar.msAcceso.accecodi = modelo.accecodi and r.rolcodi = ar.msRol.rolcodi and gr.msRol.rolcodi = r.rolcodi"
                + " and g.grupcodi = gr.msGrupo.grupcodi and u.msGrupo.grupcodi = g.grupcodi and u.usuausua=:usuausua")

})

@SequenceGenerator(sequenceName = "SEQ_ACCESO", name = "seqAcceso", allocationSize = 1)
public class MsAcceso implements Serializable {
    private static final long serialVersionUID = 1L;

    public final static String buscarTodosAcceso = "co.com.codesa.seguridad.dominio.Acceso.buscarTodosAcceso";
    public final static String buscarTodosAccesoActivos = "co.com.codesa.seguridad.dominio.Acceso.buscarTodosAccesoActivos";
    public final static String buscarAccesoActivoPorCodigo = "co.com.codesa.seguridad.dominio.Acceso.buscarAccesoActivoPorCodigo";
    public final static String buscarAccesoPorCodigo = "co.com.codesa.seguridad.dominio.Acceso.buscarAccesoPorCodigo";
    public final static String buscarAccesoPorNombre = "co.com.codesa.seguridad.dominio.Acceso.buscarAccesoPorNombre";
    public final static String buscarTodosAccesoActivosPorPrograma = "co.com.codesa.seguridad.dominio.Acceso.buscarTodosAccesoActivosPorPrograma";
    public final static String buscarTodosAccesoPorPrograma = "co.com.codesa.seguridad.dominio.Acceso.buscarTodosAccesoPorPrograma";
    public final static String buscarTodosAccesoPorUsuario = "co.com.codesa.seguridad.dominio.Acceso.buscarTodosAccesoPorUsuario";

    private Long accecodi;
    private String acceacti;
    private String accecntx;
    private String accedesc;
    private Date accefsys;
    private String acceip;
    private String accelogi;
    private String accenomb;
    private String accepuert;
    private String accetitu;
    private String accefsysS;
    private MsMenu msMenu;
    private MsPrograma msPrograma;
    private List<MsAccesoRol> msAcrols;

Если вам нужно увидеть больше кода, дайте мне знать:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...