【问题标题】:How to write HIbernate Criteria for a query with subselects如何为带有子选择的查询编写 HIbernate 标准
【发布时间】:2012-12-28 03:41:13
【问题描述】:

我有两个实体 IssueIssue_Tracker。我正在使用休眠 3.6 和一对多关联。

Issue.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";

【问题讨论】:

  • 为什么需要标准?你已经有了 SQL 查询,就用它吧。
  • 谢谢,这就是我所做的,但是是否可以使用标准来实现这一点,因为我是@beginner 级别的标准,所以

标签: java hibernate collections hibernate-criteria


【解决方案1】:

首先我建议你把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();

【讨论】:

    猜你喜欢
    • 2017-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-15
    • 2017-05-18
    • 2012-04-01
    • 2021-11-09
    相关资源
    最近更新 更多