gpt4 book ai didi

java - CriteriaQuery 带 max 的子查询

转载 作者:行者123 更新时间:2023-12-01 08:55:19 25 4
gpt4 key购买 nike

我有这样的三个类(class):

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

Class B {
Long id;
}

Class AB {
Long aId;
Long bId;
}

我必须构建一个 CriteriaQuery 来实现以下目标:

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"));

我没有得到我想要的东西。我认为我得到的是所有 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")));

关于java - CriteriaQuery 带 max 的子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42067088/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com