JPA条件连接3个表,并仅返回其组中最大日期时间的不同值
是否有一种方法可以使用JPA2 CriteriaBuilder编写与以下查询等效的代码JPA条件连接3个表,并仅返回其组中最大日期时间的不同值,jpa,join,jpa-2.0,criteria-api,Jpa,Join,Jpa 2.0,Criteria Api,是否有一种方法可以使用JPA2 CriteriaBuilder编写与以下查询等效的代码 select distinct (a.project_id,c.json) from object_metadata a, project b, (select * from task t where t.queued = (select max(queued) from task t2 where t2.project_id=t.project_id)) c where a.implementation =
select distinct (a.project_id,c.json) from object_metadata a, project b, (select * from task t where t.queued = (select max(queued) from task t2 where t2.project_id=t.project_id)) c where a.implementation = 'localfs'
and c.project_id = a.project_id;
我编写了以下查询,但结果不同:
CriteriaBuilder cb = getEm().getCriteriaBuilder();
CriteriaQuery<Tuple> cq= cb.createTupleQuery();
Root<ObjectMetadata> root = cq.from(ObjectMetadata.class);
Path<Task> task = root.get("task");
Expression<org.joda.time.LocalDateTime> queued_ = task.get(Task_.queued);
Expression<String> sJSON = task.get(Task_.sJson);
Path<Project> project = root.get("project");
Expression<String> projectId = project.get("id");
Expression<String> projectName = project.get("name");
Subquery<org.joda.time.LocalDateTime> subquery = cq.subquery(org.joda.time.LocalDateTime.class);
Root<Task> subRoot = subquery.from(Task.class);
Path<Project> subProject = subRoot.get("project");
Expression<String> subProjectId = subProject.get("id");
Expression<org.joda.time.LocalDateTime> queued = subRoot.get(Task_.queued);
subquery.select(cb.greatest(queued));
subquery.where(cb.equal(subProjectId, projectId));
cq.multiselect(projectId.alias("ID"), projectName.alias("NAME"), sJSON.alias("JSON")).distinct(true);
cq.where(cb.and(cb.equal(root.get(ObjectMetadata_.implementation), "localfs"),cb.equal(queued_, subquery)));
TypedQuery<Tuple> tq = getEm().createQuery(cq);
CriteriaBuilder cb=getEm().getCriteriaBuilder();
CriteriaQuery cq=cb.createTupleQuery();
Root=cq.from(ObjectMetadata.class);
路径任务=root.get(“任务”);
表达式queued=task.get(task\ queued);
表达式sJSON=task.get(task.sJSON);
路径项目=root.get(“项目”);
表达式projectId=project.get(“id”);
表达式projectName=project.get(“name”);
Subquery Subquery=cq.Subquery(org.joda.time.LocalDateTime.class);
Root subRoot=subquery.from(Task.class);
路径子项目=subRoot.get(“项目”);
表达式subprojectd=subProject.get(“id”);
表达式queued=subRoot.get(任务已排队);
select(cb.magest(queued));
其中(cb.equal(subprojectd,projectd));
cq.multiselect(projectd.alias(“ID”)、projectName.alias(“NAME”)、sJSON.alias(“JSON”).distinct(true);
cq.where(cb.and(cb.equal(root.get(ObjectMetadata.implementation),“localfs”)、cb.equal(queued_u,subquery));
TypedQuery tq=getEm().createQuery(cq);
不知道是否还有更多问题,但要获取路径project=root.get(“project”)
,在JPQL中,这将等同于对象\元数据a、a.project b的,而不是您发布的JPQL。@SJuan76好的。因此,根据您的说法,我应该使用JOIN吗,即JOIN objectToMetadata=root.JOIN(ExploreObjectMetadata_uuzy.project)
而不是Path project=root.get(“项目”)代码>?