0

Java コードを簡単にするために、データを使用するために 2 つの行が存在する必要があるため、2 つの行を 1 つに結合したいと考えています。

それらが私のテーブルのフィールドだとしましょう:

ID, FIELD1, FIELD2, DISCRIMINATOR, VALUE

明らかに、ID は主キーです。FIELD1 と 2 により、DISCRIMINATOR と VALUE だけが異なる 2 行の「グループ」を識別できます (識別子は、値が何を表しているかを示します)。

そして、次のように、「グループ」ごとに 1 つの POJO が必要です (ここで、FIELD1 と 2 は複合 ID として使用されます)。

FIELD1, FIELD2, VALUE1, VALUE2

どこ :

VALUE1 = 識別子 A の値

VALUE2 = 識別子 B の値

SQL では、次のようにリクエストします。

SELECT a.FIELD1, a.FIELD2, a.VALUE as VALUE1, b.VALUE as VALUE2
FROM TABLE a, TABLE b
WHERE a.FIELD1 = b.FIELD1 and a.FIELD2 = b.FIELD2
  AND a.DISCRIMINATOR = 'A'
  AND b.DISCRIMINATOR = 'B'

残念ながら、休止状態にする方法がわかりません。現在、すべての可能性に混乱しています。

私はソリューションをマッピングされた XML として使用したいと考えていますが、選択の余地がない場合でも注釈ソリューションを使用します。

4

1 に答える 1

0

テーブルを非常に単純に POJO にマップする場合 (ここでは注釈を使用しますが、XML を使用することもできます):

@Entity
@Table(name = "whatever")
public class Fields {

    @Id
    @Column(name = "ID")
    private String id;

    @Column(name = "FIELD1")
    private String field1;

    @Column(name = "FIELD2")
    private String field2;

    @Column(name = "DISCRIMINATOR")
    private String discriminator;

    @Column(name = "VALUE")
    private String value;
}

フィールドと値の両方を含む別の POJO を定義できます。

public class FieldValues {
    private String field1, field2, value1, value2;

    public FieldValues( String field1, String field2, String value1, String value2 ) {
        this.field1 = field1;
        this.field2 = field2;
        this.value1 = value1;
        this.value2 = value2;
    }
}

次に、JPQL を使用して、概説したクエリを正確に記述し、それを で実行するとEntityManager、すべての JPA トランザクションなどに参加できます。

String sql =   "SELECT a.field1, a.field2, a.value as value1, b.value as value2 "
             + "  FROM Fields a, Fields b "
             + " WHERE a.FIELD1 = b.FIELD1 and a.FIELD2 = b.FIELD2 "
             + "   AND a.DISCRIMINATOR = 'A' "
             + "   AND b.DISCRIMINATOR = 'B'";
List<Object[]> result = entityManager.createQuery(sql, Object[].class);

List<FieldValues> result = new ArrayList<FieldValues>();
for (Object[] fieldSet : result) {
    String field1 = (String) fieldSet[0];
    String field2 = (String) fieldSet[1];
    String value1 = (String) fieldSet[2];
    String value2 = (String) fieldSet[3];
    result.add(new FieldValues(field1, field2, value1, value2));
}

Hibernate をマップすることもできると思いますがFieldValues、その方法を思い出せません。適切な列名でクラスに注釈を付ける (または XML マッピングする) だけで、Hibernate にクエリから代わりにFieldValuesa を返すように強制するのと同じくらい簡単かもしれません。List<FieldValues>このアプローチの欠点は、データベースに変更を加えたりFieldValue、データベースに永続化したりすることができないことです。

もう 1 つのアプローチは、プレーンな古い SQL を .NET で使用することEntityManager.createNativeQueryです。これを行う前に、エンティティ マネージャーを確実にフラッシュする必要があります。そうしないと、保留中の変更がデータベースに書き込まれていない可能性があるため、クエリで認識されません。FieldValues繰り返しますが、この場合、Hibernate をクラスにマップすることができると思います。

于 2013-03-01T15:58:51.587 に答える