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>

JPAマッピングにEclipselinkを使用しています。2 つの問題があります。

  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");
    }
    

その場合、クエリは正しく生成されますが、同じオブジェクトの複数のインスタンスのリストを取得しています:

    public class GenericDAO {
            ...
            public List getAll() {
                    CriteriaQuery cq = em.getCriteriaBuilder().createQuery(entityClass);
                    cq.select(cq.from(entityClass));
                    em.createQuery(cq).getResultList(); を返します。
            }
    }

    new ClassDAO().getAll();

出力:

13485751-Object_1
13485751-Object_1
13485751-Object_1
13485751-Object_1
....
4

0 に答える 0