1
    <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 映射。我有两个问题:

  1. 当我使用上面的精确映射时 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)
  2. 为了解决这个问题,我使用了以下方法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
....
4

0 回答 0