我正在尝试使用条件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项目的一部分。现在,我需要了解所有这些任务的独特资产。
感谢您帮助我。
干杯
答案 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();
}