。クエリには同じ列名を持つ2つのテーブルが結合されているため、エイリアスを使用してマップする必要があります(http://www.tinesoft.com/java/be-aware-of-mutliple-result-mappings-in-jpaの説明を参照)JavaのJPA HibernateはSqlResultSetMappingエイリアス
質問を簡単にするため、質問とエンティティを最小限に縮小しました。実コードは2つのエンティティとDB関数を使用します。これが、JPQLではなくネイティブクエリを使用する理由です。
ゲートウェイ・エンティティ:
@Entity
public class Gateway implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private Integer active;
...
@Column(name = "activation_code")
private String activationCode;
...
}
SqlResultSetMapping:
@SqlResultSetMapping(
name = "GatewayWithLoc",
entities = {
@EntityResult(entityClass = Gateway.class , fields = @FieldResult(name = "id", column = "gw_id"))
}
)
問合せ:
Query query = em.createNativeQuery("SELECT gw.id AS gw_id, ..., active, activation_code, ... FROM gateway gw", "GatewayWithLoc");
List<Object[]> rows = query.getResultList();
例外:
Caused by: org.postgresql.util.PSQLException: The column name activati2_1_0_ was not found in this ResultSet.
at org.postgresql.jdbc2.AbstractJdbc2ResultSet.findColumn(AbstractJdbc2ResultSet.java:2803)
...
私はSqlResultSetMapping
にfields = @FieldResult...
なしSELECT *
を使用する場合は、期待通りのコードは動作しますが、私はので、異なるテーブルで同じカラム名のことを行うことはできません。私は迅速なソリューションを必要と
は、私は、エンティティへの手動マッピングの結果によってこの問題を解決しますが、私が何か間違ったことをやっているかどうかを知るのは素晴らしいだろうか、Hibernateは私が何をしようとしています何をサポートしていません。本「Pro JPA 2」には、動作するはずの非常によく似た例が含まれています。
更新:Hibernateは5.1.1でテスト(春4.3.2) - 同じ結果
更新:すべての列名を複数回答で述べたように指定する必要があるように見えます。これらのカラム名を手動で指定されたばかりの例外を除いて、エンティティから導出することができ - これは私には休止状態/ JPAの大きな問題のように思えます。代わりに、私はカラム名を3回書く必要があります(1.クエリー、2.結果セットマッピング3.エンティティ)。ネイティブクエリがSqlResultSetMapping
にマップされないように
私は今日だけは、この問題を発見しました。以前はJPAに満足していませんでした.JPQLの表現力が低いことにかなり失望していました(私はネイティブクエリーの方法が必要なのですが)。しかし今、これは...劇的です!私は20列を列挙しなければならず、それらのうちの1つだけが変更されれば、3つの場所で修正する必要があります。これは災害であり、私はJPA +アノテーションで最初に解決しようとしていた問題です。なぜ注文に依存しないのですか? 'id'という名前の最初の列は、 'id'フィールド、次のエンティティへの次の列などを持つ最初のエンティティに対応します。 –