【发布时间】:2012-12-01 04:03:08
【问题描述】:
在我的应用程序中,我有 2 个表格,结算结果和结算状态 结算结果包含一些基本数据,如名称、类型等。 SettlementState 是与 Settlement Result 关系的“多”方,由 Settlement Result PK 和 Status as Many-To-One ID as 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[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;
}
【问题讨论】:
-
你能发布映射吗?
-
编辑完成,不是完整的映射,但有相关字段
-
同时发布您用来获取数据的查询。
-
select distinct a -> a 没有定义。错字? hibernate 不抱怨这个吗?
-
扩展了我的描述。一点点,这样你就可以清楚地了解我想要实现的目标