テーブルを非常に単純に 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 にクエリから代わりにFieldValues
a を返すように強制するのと同じくらい簡単かもしれません。List<FieldValues>
このアプローチの欠点は、データベースに変更を加えたりFieldValue
、データベースに永続化したりすることができないことです。
もう 1 つのアプローチは、プレーンな古い SQL を .NET で使用することEntityManager.createNativeQuery
です。これを行う前に、エンティティ マネージャーを確実にフラッシュする必要があります。そうしないと、保留中の変更がデータベースに書き込まれていない可能性があるため、クエリで認識されません。FieldValues
繰り返しますが、この場合、Hibernate をクラスにマップすることができると思います。