[英]How to write HIbernate Criteria for a query with subselects
我有兩個實體Issue和Issue_Tracker 。 我正在使用 hibernate 3.6 和一對多關聯。
問題.java
public class Issue implements Serializable {
private Integer issue_id;
private String issue_description;
private Date issue_raised_date;
private Set<Issue_Tracker> issueTracker = new HashSet<Issue_Tracker>(0);
@OneToMany(fetch=FetchType.LAZY, mappedBy="issue_id")
public Set<Issue_Tracker> getIssueTracker() {
return issueTracker;
}
public void setIssueTracker(Set<Issue_Tracker> issueTracker) {
this.issueTracker = issueTracker;
Issue_Tracker.java
public class Issue_Tracker implements Serializable
{
private Integer issue_id;
private String tracker_status;
private Timestamp tracked_time;**
這是sql 查詢,如何使用標准實現這一點
SELECT i.issue_id, i.issue_description,
it.tracker_status, it.tracked_time
FROM issues i
LEFT JOIN ( SELECT it.issue_id, it.tracker_status, it.tracked_time
FROM issue_tracker it
INNER JOIN (SELECT issue_id, MAX(tracked_time) tracked_time
FROM issue_tracker GROUP BY issue_id
) A ON it.issue_id = A.issue_id AND it.tracked_time = A.tracked_time
) it ON i.issue_id = it.issue_id
WHERE i.status = "Escalate To";
首先,我建議您將令人困惑的 Issue.issueTracker 名稱更改為 Issue.issueTrackers,因為它是一個 Set。 它使您在查詢時更容易閱讀。 但是無所謂。
在 Criteria API 中,我認為您無法直接翻譯此 SQL。 你最好寫下你想要的結果集的描述。 您是否想要所有具有“升級到”狀態的問題的最后跟蹤時間? 如果是這樣,這應該接近你想要的。
DetachedCriteria inner = DetachedCriteria.forClass(IssueTracker.class, "inner")
.setProjection(Projections.max("inner.tracked_time"));
Criteria crit = session.createCriteria(Issue.class, "issue");
// Add the join with an ON clause (I am not sure why you need the LEFT JOIN)
crit.createAlias("issueTracker", "it", Criteria.LEFT_JOIN,
Subqueries.eqProperty("it.tracked_time", inner));
// Specify the SELECT fields
crit.setProjections(Projections.projectionList()
.add(Projections.property("issue_id"))
// etc
.add(Projections.property("it.tracked_time"));
crit.add(Restrictions.eq("status", "Escalate To");
List<Object[]> rows = crit.list();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.