Glassfish部署EAR文件时JPQL命名查询语法错误求助
问题排查与解决方案
核心原因:版本兼容性差异
你本地测试使用的EclipseLink版本大概率高于Glassfish内置的2.3.2版本(2011年发布),新版本支持的JPQL语法在老版本中存在兼容性问题,导致部署时解析失败。
具体问题点及修复方案
针对你的命名查询,以下几个语法点在EclipseLink 2.3.2中存在限制:
DISTINCT后多余的括号
老版本EclipseLink不支持DISTINCT(e.procedure)这种带括号的写法,需去掉括号改为DISTINCT e.procedure,子查询中的DISTINCT(e.cdExecProcs)同理。隐式连接的写法兼容性
子查询中FROM ExeProc e, ExeStep s where s.ExecProc.cdExecProcs = e.cdExecProcs这种隐式连接的写法,在老版本中解析容易出错,建议改用标准的显式JOIN语法。别名冲突与大小写敏感
子查询和外部查询使用了相同的别名e,可能导致解析歧义;同时老版本对实体属性名的大小写检查更严格(比如s.ExecProc如果对应实体属性是execProc小写开头,会直接报错)。
修改后的命名查询代码
@Entity @Table(name = "T_EXE_PROC") @TableGenerator(name = "ExecuProcGenerator", table = "T_SEQ", pkColumnName = "SEQ_COL", valueColumnName = "SEQ_CONTATOR", pkColumnValue = "EXE_PRO_SEQUE", allocationSize = 10, initialValue = 0) @NamedQueries({ @NamedQuery(name = "ExeProc.findLastExecProcs", query = "SELECT DISTINCT e.procedure " + "FROM ExeProc e " + "WHERE e.cdExecProcs IN (" + "SELECT DISTINCT e2.cdExecProcs " + "FROM ExeStep s JOIN s.execProc e2 " + "WHERE s.stat.cdStation = :cdStation AND s.oper.ceLogin = :ceLogin" + ") " + "AND e.statusExecProc = :statusExecProc " + "AND e.procedure.status = 1 " + "ORDER BY e.lastModifiedStepTime DESC") }) public class ExeProc implements Serializable { private static final long serialVersionUID = 12348979846545312L; public static final String FIND_LAST_EXEC_PROC = "ExeProc.findLastExecProcs"; }
额外排查点
- 检查
persistence.xml配置:确保Glassfish部署时使用的JPA实现是EclipseLink,且没有指定与内置版本冲突的配置。 - 验证实体属性名:确认
ExeStep类中关联ExeProc的属性名是execProc(小写开头),与查询中的s.execProc一致。
内容的提问来源于stack exchange,提问作者anon
相关产品推荐
相关产品推荐

