質問

次のBean Task、ServerDetails、およびApplicationDetailsがあります。 特定のアプリケーション名に基づいて、すべてのタスク、それらのサーバーの詳細、およびアプリケーションの詳細を取得したい。

結果から、次のような方法でデータを取得できると期待しています。 task.getServers()。getApplicationDetails()

実際には、Object []としてのフラットデータの表現と思われるものを取得します。

提案したことを実行する方法はありますか?

次は私のコードです...

class Task {
    private String taskId;
    private Set<ServerDetails> servers;
}

class ServerDetails {
    private String id;
    private Set<ApplicationDetails> applications;
}

class ApplicationDetails {
   private String id;
}

HQL:

StringBuilder hql = new StringBuilder(256);
hql.append("FROM Task h, ServerDetails ser, ApplicationDetails app ");
hql.append("WHERE h.executionDate > "); 
hql.append("to_date('");
hql.append(DBDateFormatter.getInstance().formatDate(cal));
hql.append("',  '");
hql.append(DBDateFormatter.getInstance().getOracleDateFormat());
hql.append("') and h.id = ser.task.id and ser.id = app.server and app.name = 'XXX'");
hql.append(" order by h.executionDate desc");
String hql = hql.toString();

Query query = session.createQuery(hql);      
results = (List<Object[]>) query.list();
役に立ちましたか?

解決

メインオブジェクトを取得するだけです。

もう一方については、次のことができます。

  1. Session が閉じられていないときにそれらに移動します(必要に応じて追加のクエリを実行します。レイジーと呼ばれます。これは使いやすさに最適です)
  2. キーワード fetch を使用して、元のクエリで取得します。

例:

    SELECT h 
    FROM Task h
    JOIN FETCH h.serveurs ser
    JOIN FETCH ser.applications app 
    WHERE h.executionDate > 
    .... // no need to specify the joins

次のような方法でデータを取得できます。
task.getServers()。getApplicationDetails()

他のヒント

LEFT JOIN FECHを使用して他の人が言ったように、オブジェクトグラフを取得できます。オブジェクトグラフを取得するときに見つけた1つの問題、多対1の関係をたどると、追加のデータベースアクセスなしでは元に戻れません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top