Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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
JPA条件连接3个表,并仅返回其组中最大日期时间的不同值_Jpa_Join_Jpa 2.0_Criteria Api - Fatal编程技术网

JPA条件连接3个表,并仅返回其组中最大日期时间的不同值

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 =

是否有一种方法可以使用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 = '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(“项目”)