InheritanceType.JOINED
で動作するネイティブクエリを取得するのには苦労しています。ハイバーネイトdocumentationから私は見つけました:ネイティブクエリにInheritanceType.JOINEDのエンティティを追加します。
13.1.6。
継承の一部としてマップされたエンティティをクエリするネイティブSQLクエリには、ベースクラスとすべてのサブクラスのすべてのプロパティが含まれている必要があります。
使用して、次の2つのエンティティ:
@Data
@Entity
@Table(name = "my_super")
@EqualsAndHashCode(of = {"id"})
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class MySuper {
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private long id;
}
そして:
@Data
@Entity
@Table(name = "my_sub_a")
@EqualsAndHashCode(callSuper = true)
public class MySubA extends MySuper {
@Column(name = "x")
private int x;
}
私が使用してネイティブクエリを作成しよう:
Object actual = session
.createNativeQuery("SELECT {s.*} FROM my_super {s} LEFT JOIN my_sub_a {a} USING (id)")
.addEntity("s", MySuper.class)
.getSingleResult();
それはクエリに変換:
SELECT s.id as id1_1_0_, s_1_.x as x1_0_0_, case when s_1_.id is not null then 1 when s.id is not null then 0 end as clazz_0_ FROM my_super s LEFT JOIN my_sub_a a USING (id)
そしてで失敗します。だから私たちはそれは同様my_sub_a
のx
列を必要とするかもしれないことを考え出す、その仕事をして別名インジェクションを観察
javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not prepare statement
Caused by: org.hibernate.exception.SQLGrammarException: could not prepare statement
Caused by: org.h2.jdbc.JdbcSQLException: Column "S_1_.X" not found; SQL statement:
。しかし、my_sub_a
のエイリアスを知ることはできません。このエイリアスも適切に接続されるように、コードをどのように変更する必要がありますか?
マイコードは、https://gist.github.com/JWGmeligMeyling/51e8a305f3c268eda473511e202f76e8で入手できます。
(私はこのクエリは簡単にだけでなくJPQLまたはHQLで表現することができることを認識しています、とさえEntityManager
とSession
APIのを使用して達成することができる。私はしかし私ことを、より複雑なクエリでこれを使用したくありませんこの質問に必要なすべての詳細に簡略化されています)。
おそらくA' 'と' '{A}を交換する、または別の' .addEntity( "A" を追加する必要があり、次のいずれかここで
は、私はそれが少しを助けるん願って、テストされています.class) '、それはエイリアスを混乱させているからです。しかし、これはちょうど試しです。 –
私が引用したドキュメントから得られるものは、選択肢に 'SELECT {s。*}、{a。*} [...]'というプロパティを含める必要があるということです。また、おそらく抽象クラスをインスタンス化できないため、スーパークラスなしで '.addEntity(" a "、MySubA.class)'を試してください。 – drakyoko
Hibernateは '.addEntity(" a "、MySubA.class)'を使用するなら、それはそうではありません。Hibernateは、同じエンティティに属するプロパティを調べるのではなく、2つの異なるエンティティをフェッチする必要があると仮定します。私が照会で参照していない '{a}'を使用しているのは、実際はコピー・ペースト・エラーです。 –