<entity class="com.AbstractClass" access="FIELD">
<table name="TABLE_0"/>
<secondary-table name="TABLE_1">
<primary-key-join-column name="TABLE0_REF_ID" referenced-column-name="TABLE0_ID"/>
</secondary-table>
<inheritance strategy="SINGLE_TABLE"/>
<discriminator-column name="TYPE" discriminator-type="INTEGER"/>
<attributes>
<id name="id">
<column table="TABLE_1" name="TABLE1_ID"/>
<generated-value generator="GLOBAL_GENERATOR" strategy="SEQUENCE"/>
</id>
<basic name="name">
<column table="TABLE1" name="NAME"/>
</basic>
</attributes>
</entity>
<entity class="com.DateClass">
<discriminator-value>2</discriminator-value>
<attributes>
<basic name="date">
<column table="TABLE_1" name="DATE"/>
</basic>
</attributes>
</entity>
我正在使用 Eclipselink 进行 JPA 映射。我有两个问题:
- 当我使用上面的精确映射时 eclipselink 生成错误的查询(主表主键的表错误;我认为这是因为主键在辅助表中,但我无法更改它 -
TABLE_0
并且TABLE_1
我有不同的主键无法更改数据库):[EL Fine]: sql: SELECT t0.NAME t1.TABLE1_ID FROM TABLE_0 t0, TABLE_1 t1 WHERE (t1.TABLE0_REF_ID = t1.TABLE0_ID)
为了解决这个问题,我使用了以下方法
DescriptorCustomizer
(我无法切换主表和辅助表,因为必须在主表中):@Override public void customize(ClassDescriptor descriptor) throws Exception { descriptor.getAdditionalTablePrimaryKeyFields().clear(); descriptor.getMultipleTableForeignKeys().clear(); descriptor.addForeignKeyFieldNameForMultipleTable("TABLE_0.TABLE0_ID", "TABLE_1.TABLE0_REF_ID"); }
在这种情况下,查询生成正确,但我得到了同一对象的多个实例的列表:
公共类 GenericDAO { ... 公共列表 getAll() { CriteriaQuery cq = em.getCriteriaBuilder().createQuery(entityClass); cq.select(cq.from(entityClass)); 返回 em.createQuery(cq).getResultList(); } } 新的 ClassDAO().getAll();
输出:
13485751-Object_1
13485751-Object_1
13485751-Object_1
13485751-Object_1
....