在我的应用程序中,我有 2 个表格,结算结果和结算状态结算结果包含一些基本数据,如名称、类型等。结算状态是与结算结果相关的“多”方面,包括结算结果 PK 和多对状态-一个ID作为PK和一个日期。示例数据:
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 时,总会有一些“工作流程”。首先,Result 的状态为 Created (ID 1)。然后它可以被拒绝(ID 4)或确认(ID 2)。然后我们可以再次接受或拒绝。
因此,一个 SettlementResult 可以具有状态 ID 为 1、2、4 的 SettlementStates(已创建、已确认,但未接受=拒绝)。
问题是,我只想选择那些具有特定状态(例如 Created)的 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 等于 created 的结果)。
是否可以仅选择仅具有特定状态的那些结算结果,例如,如果我们想要 Created[ID 1],我们将获得所有结算状态状态为 1,没有 2,3 或 4 状态的所有结算结果。当我们选择状态 id 为 3 的那些时,我们可以接受状态 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;
}