私のアプリには、2つのテーブルがあります。決済結果と決済状態決済結果には、名前、タイプなどの基本データが含まれています。決済状態は、決済結果との関係の「多」側であり、決済結果PKとステータスを多対多で構成します。 -PKおよび日付として1つのID。データ例:
Settlement Result
------------------------------
ID| Name | Sth
------------------------------
1 | Some Name | Something more
2 | Name2 | more2
Settlement State
----------
Result's ID | StatusId | Date
------------------------------
1 | 1 | some date
1 | 2 | date
1 | 3 | date
2 | 1 | date
ここで、HQL / Plain SQLを使用して、決済結果からの行を選択します。たとえば、ステータスID == 3ですが、IDが高い行は選択しません。
考えられるステータスはいくつかあります。
Status ID | Desc
-----------------
1 | Created
2 | Confirmed
3 | Accepted
4 | Rejected
SettlementResultを作成するときは、常に「ワークフロー」があります。まず、結果のステータスは作成済み(ID 1)です。次に、拒否(ID 4)または確認(ID 2)することができます。その後、再びそれを受け入れるか拒否することができます。
したがって、1つのSettlementResultは、ステータスIDが1,2,4(Created、Confirmed、ただしAccepted = Rejectedではない)のSettlementStatesを持つことができます。
問題は、特定のステータス(たとえば、作成済み)を持つSettlementResultsのみを選択したいということです。」
このようなHQLクエリを使用すると:
Query query = session.createSQLQuery( "select distinct s from SettlementResult s join s.settlementStates states where states.settlementStatePK.status.statusId == 1" );
ステータスが1、2、3の場合でも、すべての決済結果が返されます(コレクションには、作成されたIDと等しいIDの結果が含まれているため)。
たとえば、Created [ID 1]が必要な場合、特定のステータスのみを持つ決済結果のみを選択することは可能ですか。決済状態ステータスが1のみで、2、3、または4ステータスはありません。ステータスID3の決済状態を選択すると、ステータスID = 1,2,3の決済状態であるが、4ではない場合に受け入れることができmax[status.id]
ます。
@Entity
@Table(name = "SETTLEMENT_STATE")
public class SettlementState
{
@EmbeddedId
private SettlementStatePK settlementStatePK;
@Column(name = "DESCRIPTION")
private String description;
@Column(name = "STATUS_DTTM")
private Date statusDate;
}
@Embeddable
public class SettlementStatePK implements Serializable
{
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "STATUS_ID")
private Status status;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "SETTLEMENT_RESULT_ID")
private SettlementResult settlementResult;
}
@Entity
@Table(name = "SETTLEMENT_RESULT")
public class SettlementResult implements Serializable
{
@Id
@Column(name = "SETTLEMENT_RESULT_ID")
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "STATUS_ID")
private Status status;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "MODEL_GROUP_ID")
private SettlementModelGroup settlementModelGroup;
@Column(name = "\"MODE\"")
private Integer mode;
@Column(name = "CREATED_DTTM")
private Date createdDate;
@Column(name = "DESCRIPTION")
private String description;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "settlementStatePK.settlementResult")
private List<SettlementState> settlementStates;
}