JPA与EclipseLink继承实现异常:查询表及别名错误
EclipseLink TABLE_PER_CLASS继承映射查询错误
问题场景
在两个类间实现TABLE_PER_CLASS继承映射,基于Product类创建DataProvider用于Grid组件时功能正常,但对@ManyToOne属性执行过滤操作时出现SQL语法错误。
实体类定义
Product类
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) @Table(name="product") @DiscriminatorColumn(name = "product_type_desc", discriminatorType = DiscriminatorType.STRING) public class Product { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) @Column(name="id") private int id; @OneToOne @JoinColumn(name = "product_model_id") private ProductModel productModel; }
ProductModel类
@Table(name="product_model") @DiscriminatorValue("product_model") public class ProductModel extends Product { @OneToOne(mappedBy = "productModel") private Product product; }
报错信息
Internal Exception: java.sql.SQLSyntaxErrorException: Unknown column 't0.id' in 'order clause' Error Code: 1054 Call: SELECT t1.id AS a1, t1.product_model_id AS a89 FROM product_model t1 WHERE (t1.disabled = ?) ORDER BY t0.id DESC LIMIT ?, ?
错误点
- 查询时未使用
product表,反而调用了product_model表 - ORDER BY子句中引用了未定义的表别名
t0
问题分析
- EclipseLink最初正确构建了以
t0为别名的product表查询语句 - 构建SELECT语句时错误选择了
product_model表而非product表 - 更新FROM子句并将表别名改为
t1后,未同步修改ORDER BY子句中的别名引用
尝试过的解决方法
使用ClassExtractor,但问题未得到解决
环境信息
- EclipseLink 2.7.12
- JavaX Persistence 2.2.1
- 使用Criteria API
内容的提问来源于stack exchange,提问作者Yberamos
相关产品推荐
相关产品推荐

