使用条件API的复杂hibernate查询

时间:2012-05-24 17:22:07

标签: java sql hibernate criteria

我正在尝试使用条件API编写复杂查询。我可以帮忙解决这个问题。

我有3个类,Assets,AssetComponent和Tasks。 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查询应返回已分配资产的所有任务,并且是give项目的一部分。现在,我需要了解所有这些任务的独特资产。

感谢您帮助我。

干杯

1 个答案:

答案 0 :(得分: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();
}