0

我正在尝试使用标准 API 编写一个复杂的查询。我可以在这方面使用一些帮助。

我有 3 个类,资产、资产组件和任务。Task 类与 AssetComponent 具有 1 对 M 的关系,AssetComponent 与 Asset 具有 1 对 M 的关系。我需要找到与它们相关联的一些任务的所有资产(它应该是唯一列表)(任务有一个组件,并且该组件知道它连接的资产)。

这是我到目前为止所拥有的

public List<Asset> retrieveTask(Project project, boolean assigned) {

  DetachedCriteria subquery = DetachedCriteria.forClass(Task.class);

  subquery.add(Restrictions.eq("project", project));
  if (assigned) {
     subquery.add(Restrictions.isNotNull("assignedTo"));
  } else {
     subquery.add(Restrictions.isNull("assignedTo"));
  }

  subquery = subquery.createCriteria("component");
  subquery.add(Restrictions.isNotNull("asset"));

  Criteria criteria = super.createCriteria();
  criteria.add(Subqueries.in("id", subquery));

  return criteria.list();
}

deataced 查询应返回所有已分配资产的任务,并且是给定项目的一部分。现在我需要看看所有这些任务的独特资产是什么。

谢谢你帮我解决这个问题。

干杯

4

1 回答 1

1

在黑暗中拍摄了一点,但这对你有什么作用:

public List<Asset> retrieveTask(Project project, boolean assigned) {

    DetachedCriteria subquery = DetachedCriteria.forClass(Task.class);

    subquery.add(Restrictions.eq("project", project));
    DetachedCriteria assetCriteria = subquery
        .createCriteria("component")
        .createCriteria("asset").setProjection(Projections.groupProperty("id"));

    Criteria criteria = super.createCriteria();
    if(assigned) {
        criteria.add(Subqueries.propertyIn("id", subquery));
    }
    else {
        criteria.add(Subqueries.propertyNotIn("id", subquery));
    }
    return criteria.list();
}
于 2012-05-24T17:46:26.513 回答