2017-02-24 3 views
0

したがって、それぞれがdbテーブルにマップする2つのオブジェクトがあります。Hibernate Complex Join

public class Dispute { 
    private Long disputeSeqNo; 
    private List<StatusInfo> statusInfos; 
} 

public class StatusInfo { 
    private Long statusSeqNo; 
    private Date createdDt; 
    private String statusCd; 
    private Dispute dispute; 
} 

紛争には、0以上のStatusInfoが関連付けられている可能性があります。

現在、hibernateは、すべてのDisputeについてすべてのStatusInfoオブジェクトを返しています。ある場合には、これが望ましい。しかし、私はユースケースを持っています:

  • 各紛争の最新のStatusInfoを表示するだけです。
  • さらに、この同じディスプレイには、最新のStatusInfo.statusCd値でソートする機能が必要です。私のディスプレイはページングされているので(休止状態のページ区切り機能を使用して)、このソートはデータベースで行う必要があります。

私はこれを行うことができますが、これをHQLに変換するのに苦労しています。これは、データを並べ替えることができます。

HQLでこれを解決する方法についてのご意見はありますか?私がまだ帰ってきたところ:

List<Dispute> 

フィードバックをお寄せいただきありがとうございます。

ありがとうございます!

+0

あなたのケースに適したSQLクエリを追加してください。 –

+0

できません。紛争のstatusInfosは紛争のstatusInfosです。それらのすべて。それはあなたがデータベースから紛争を得た方法に依存しません。紛争の最新のstatusInfoが必要な場合は、StatusInfoを選択するクエリが必要です。 '紛争の選択、紛争からのstatusInfo d。d.statusInfos statusInfo where ... 'のようなもの。 –

答えて

0

最初に行う必要があるのは、以下のHibernateフィルタを定義することです。このアノテーションは、Disputeクラスの上部に追加するだけです。

@OneToMany(mappedBy = "dispute") 
@Filter( 
    name = "dispute-with-latest-statusinfo", 
    condition = "statusinfo_id = (select max(si.statusinfo_id) from 
    StatusInfo si WHERE si.dispute_dispute_id = dispute_dispute_id") 
private List<StatusInfo> statusInfos; 

あなたの最初の要件を満たすために、あなたが可能にすることによって、彼らの最新StatusInfoDisputeインスタンスのリストを取得することができます。

@FilterDef(name = "dispute-with-latest-statusinfo") 

次はあなたが以下のようにStatusInfoのあなたのコレクションにこの名前のフィルタを適用する必要がありますセッションでそのフィルタを実行してからクエリを実行します。

session.enableFilter("dispute-with-latest-statusinfo"); 
List<Dispute> disputes = session 
    .createQuery("FROM Dispute d JOIN FETCH d.statusInfos", Dispute.class) 
    .getResultList() 

結果を並べ替えるには質問:

session.enableFilter("dispute-with-latest-statusinfo"); 
List<Dispute> disputes = session 
    .createQuery("FROM Dispute d JOIN FETCH d.statusInfos si ORDER BY si.status DESC", Dispute.class) 
    .getResultList() 

を今、あなたはこれらのケースのための単一の要素が含まれていList<StatusInfo>で作業する必要が好きではない場合、あなたは、オブジェクトを取得したりすることなく、nullを得ることができるように支援するための過渡的なメソッドを追加することができますコレクションのセマンティクスで心配する必要があります。

@Transient 
public StatusInfo getLatestStatusInfo() { 
    if (statusInfos.isEmpty()) { 
    return null; 
    } 
    else if (statusInfos.size() == 1) { 
    return statusInfos.get(0); 
    } 
    else { 
    // you could add logic here to do the sort in-memory 
    // for cases where you may have the full collection 
    // but still want to obtain the last entry ... 
    } 
} 
+0

私が探していた情報の正確な種類のようです。私は確かにこれを試してみましょう!どうもありがとう。 –

+0

これはまさに私が必要としていたものでした。私はこれらのフィルターがどこに信じられないほど有用かを見ることができます。本当にありがとうございます。 –

+0

@PaulAckley喜んで助けてください。 – Naros