Quarkus と Hibernate/Panache を使用しています。
この例では、ネイティブ クエリを使用して結合する3 つのテーブル ( table_a
、table_b
、 ) があります。table_c
私が取り組んでいるプロジェクトでは、JOIN
探している情報を取得するのに約 5 つのテーブルが必要です。
table_b
は純粋に と のマッピング/結合テーブルtable_a
ですtable_c
:
SELECT
a.id,
a.name,
c.login_date
FROM
table_a a
JOIN table_b b ON b.a_id = a.id
JOIN table_c c ON b.c_id = c.id
WHERE
c.login_date > '01-MAY-21'
上記をHQLに移植しています。@Entity
すべてのクラスを、それぞれの名前@Table
とともに、それぞれにマップしました。@Column
私たちはその部門で優れています。
SELECT
a.id,
a.name,
c.loginDate
FROM
TableA a
JOIN TableA b ON b.aId = a.id
JOIN TableB c ON b.cId = c.id
WHERE
c.loginDate > '01-MAY-21'
と だけを探していname
ますlogin_date
。他にもたくさんの情報が保存されてtable_a
おりtable_c
、この特定のクエリには必要ありません。そこで、この呼び出し用のエンティティを作成しました:
@Entity
@IdClass(LoginDetailsPk.class)
@NamedQuery(
name = "LoginDetails.findFromDate",
query = "FROM TableA a " +
"JOIN TableA b ON b.aId = a.id " +
"JOIN TableB c ON b.cId = c.id " +
"WHERE c.loginDate > '01-MAY-21'"
)
public class LoginDetails extends PanacheEntityBase {
@Id
private int id;
@Id
private String name;
@Id
private String loginDate;
public static List<LoginDetails> findFromDate(String fromDate) {
// Eventually pass fromDate into find()
return find("#LoginDetails.findFromDate").list();
}
}
return
なぜ偶数が機能するのかを理解するのに苦労しています。呼び出しLoginDetails.findFromDate(...)
て に保存すると、List<LoginDetails>
正常に動作します。ただし、リストにアクセスしようとすると、ClassCastException
エラーが発生します。
List<LoginDetails> details = LoginDetails.findFromDate(null);
for(LoginDetails detail : details) { // <------ Throws a class cast exception
//...
}
デバッグ後、my に格納されているジェネリック型が自分のクラスList
ではないことに気付きました。LoginDetails
むしろ、それはオブジェクトの配列 ( List<Object[]>
) であり、私@Entities
が探していない関連性のないすべての情報を含んでいます。
道に迷いました。ネイティブ クエリに戻す方が理にかなっているでしょうか。