1

Quarkus と Hibernate/Panache を使用しています。

この例では、ネイティブ クエリを使用して結合する3 つのテーブル ( table_atable_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が探していない関連性のないすべての情報を含んでいます。

道に迷いました。ネイティブ クエリに戻す方が理にかなっているでしょうか。

4

1 に答える 1