Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何为具有子选择的查询编写HIbernate条件_Java_Hibernate_Collections_Hibernate Criteria - Fatal编程技术网

Java 如何为具有子选择的查询编写HIbernate条件

Java 如何为具有子选择的查询编写HIbernate条件,java,hibernate,collections,hibernate-criteria,Java,Hibernate,Collections,Hibernate Criteria,我有两个实体问题和问题追踪者。我正在使用Hibernate3.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&g

我有两个实体问题问题追踪者。我正在使用Hibernate3.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;
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,因为它是一个集合。当您进行查询时,它使内容更易于阅读。但不管怎样

在CriteriaAPI中,我认为您不能直接翻译此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();
DetachedCriteria-inner=DetachedCriteria.forClass(IssueTracker.class,“inner”)
.setProjection(projects.max(“内部跟踪时间”);
Criteria crit=session.createCriteria(Issue.class,“Issue”);
//添加带有ON子句的联接(我不确定为什么需要左联接)
crit.createAlias(“issueTracker”、“it”、Criteria.LEFT\u JOIN、,
子查询.eqProperty(“it.tracked_time”,内部));
//指定“选择”字段
crit.setProjections(Projections.projectionList()
.add(Projections.property(“问题id”))
//等
.add(Projections.property(“it.tracked_time”);
标准添加(限制条件(“状态”,“升级到”);
列表行=crit.List();

为什么需要条件?您已经有了SQL查询,只需使用它即可。谢谢,这就是我所做的,但是使用条件是否可以实现这一点,因为我是@初学者级别的条件,所以也可以