java - 如何在 jpql 中使用左连接
问题描述
嘿伙计们,这个查询在 oracle(sqldeveloper)中运行良好,但是当我尝试在 jpql 命名查询上使用它时,它给了我一个错误,我假设它与我做外部联接的方式有关,但我不太确定,我需要外部联接即使它们为空,也能够获取 MsMenu。
在 oracle 上进行的查询(工作):
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;
如果您需要查看更多代码,请告诉我:)
解决方案
推荐阅读
- xaml - CommandBar AppBarButton 图标大小
- json - 当我遍历'JSON'结果时,错误“类型'Any'不符合协议'Sequence”是什么意思?
- node.js - ubuntu 上的 Selenium 错误:未知错误:Chrome 无法启动:异常退出
- windows - 在 Visual Studio 上使用 MASM 将 hello world 写入带有 DOS 中断的控制台
- visual-studio-code - VSCode 是否有一个插件可以“学习”最常用的代码片段?
- django - 如何访问查询集中的缓存属性
- c++ - 无法打印在在线编译器中打印完美的心形
- javascript - 如何在循环中保存对象的“上一个”和“下一个”迭代?
- android - 将 SVG 转换为 Android Vector Drawable
- reactjs - React 组件加载到页面的一半