Java 带max的CriteriaQuery子查询

Java 带max的CriteriaQuery子查询,java,hibernate,hibernate-criteria,criteriaquery,Java,Hibernate,Hibernate Criteria,Criteriaquery,我有三个这样的课程: Class A { Long id; Date d; String e; } Class B { Long id; } Class AB { Long aId; Long bId; } 我必须建立一个标准查询来实现以下目标: select distinct(b.id) from b b inner join ab ab on ab.bid = b.id inner join a a on a.id = ab.aid

我有三个这样的课程:

Class A { 
    Long id;
    Date d;
    String e;
}

Class B { 
    Long id;
}

Class AB {
    Long aId;
    Long bId;
}
我必须建立一个标准查询来实现以下目标:

select distinct(b.id) from b b
inner join ab ab on ab.bid = b.id
inner join a a on a.id = ab.aid
where e = 'SOMETHING'
and a.d in (
    select max(aa.d)
    from a aa
    inner join ab aabb on aa.id = aabb.aid
    inner join b bb on bb.id = aabb.bid
    where bb.id = b.id
)
但我遗漏了一些东西,因为:

List<Predicate> predicates = new ArrayList<Predicate>();
Join<B, A> joinAB = root.join("a", JoinType.INNER); // root is Root<B>
Subquery<A> sqA = query.subquery(A.class); // query is CriteriaQuery
Root<A> rootSqA = sqA.from(A.class);

sqA.select(builder.max((Expression)rootSqA.get("d")));
sqA.where(builder.and(joinAB.get("id").in(rootSqA.get("id))));                      
predicates.add(builder.in(sqA).value((Expression)joinAB.get("d")));

predicates.add(builder.equal(joinAB.get("e"), "SOMETHING"));
List谓词=new ArrayList();
Join joinAB=root.Join(“a”,JoinType.INNER);//根就是根
子查询sqA=query.Subquery(A.class);//查询是标准查询
根rootSqA=sqA.from(A.class);
select(builder.max((表达式)rootSqA.get(“d”));
sqA.where(builder.and(joinAB.get(“id”)in(rootSqA.get(“id”)));
add(builder.in(sqA.value)((表达式)joinAB.get(“d”));
add(builder.equal(joinAB.get(“e”),“SOMETHING”);

我没有得到我想要的。我想我得到的是所有的C对象(带有最后一个A对象),它们在某个点上有一个带有e=“SOMETHING”的对象A。但我想要的是所有的C对象,它们的最后一个A对象带有e=“SOMETHING”“

正如经常发生的那样,在这里发布了一个问题之后,我意识到我只是个傻瓜,我只需要完全理解这个问题,最重要的是我正在使用的框架(我是CriteriaBuilder的新手),然后我就自己的问题找到了答案

这就是:

Join<B, A> joinAB = root.join(B_.a, JoinType.INNER);
Subquery<Date> sqB = query.subquery(Date.class);
Root<B> rootSq = sqB.from(B.class);
Join<B, A> joinSq = rootSq.join(B_.lastA, JoinType.INNER);
sqB.select(builder.max((Expression)joinSq.get(A_.date))); 
sqB.where(builder.equal((Expression)rootSq.get(A.id), root.get(A_.id))); 
predicates.add(builder.and(
        builder.equal(joinAB.get(A_.d), sqB), 
        builder.equal(joinAB.get(A_.e), "SOMETHING"))); 
joinjoinab=root.Join(B_u2;u2.a,JoinType.INNER);
Subquery sqB=query.Subquery(Date.class);
根rootSq=sqB.from(B.class);
Join-joinSq=rootSq.Join(B.lastA,JoinType.INNER);
sqB.select(builder.max((表达式)joinSq.get(日期));
其中(builder.equal((表达式)rootSq.get(A.id),root.get(A_u.id));
add(builder.and(
同等建筑商(joinAB.get(A_u.d),sqB),
平等(joinAB.get(A_.e),“某物”);

正如经常发生的那样,在这里发布了一个问题之后,我意识到我只是个傻瓜,我只需要完全理解这个问题,最重要的是我正在使用的框架(我是CriteriaBuilder的新手),然后我就自己的问题找到了答案

这就是:

Join<B, A> joinAB = root.join(B_.a, JoinType.INNER);
Subquery<Date> sqB = query.subquery(Date.class);
Root<B> rootSq = sqB.from(B.class);
Join<B, A> joinSq = rootSq.join(B_.lastA, JoinType.INNER);
sqB.select(builder.max((Expression)joinSq.get(A_.date))); 
sqB.where(builder.equal((Expression)rootSq.get(A.id), root.get(A_.id))); 
predicates.add(builder.and(
        builder.equal(joinAB.get(A_.d), sqB), 
        builder.equal(joinAB.get(A_.e), "SOMETHING"))); 
joinjoinab=root.Join(B_u2;u2.a,JoinType.INNER);
Subquery sqB=query.Subquery(Date.class);
根rootSq=sqB.from(B.class);
Join-joinSq=rootSq.Join(B.lastA,JoinType.INNER);
sqB.select(builder.max((表达式)joinSq.get(日期));
其中(builder.equal((表达式)rootSq.get(A.id),root.get(A_u.id));
add(builder.and(
同等建筑商(joinAB.get(A_u.d),sqB),
平等(joinAB.get(A_.e),“某物”);