Tôi đang cố gắng viết một truy vấn trong QueryDSL để tìm nạp các phần tử cũ nhất của một bảng được nhóm theo parentId của chúng.QueryDSL và SubQuery với điều kiện Tuple
SQL tương đương nên là:
SELECT a.* FROM child a
INNER JOIN
(
SELECT parentId, MAX(revision) FROM child GROUP BY parentId
) b
ON (
a.parentId = b.parentId AND a.revision = b.revision
)
Bây giờ trong QueryDSL Tôi đang mắc kẹt với cú pháp.
JPQLQuery<Tuple> subquery = JPAExpressions
.select(child.parent, child.revision.max())
.from(child)
.groupBy(child.parent);
HibernateQuery<Child> query = new HibernateQuery<>(session);
query.from(child)
.where(child.parent.eq(subquery.???).and(child.revision.eq(subquery.???))));
Làm cách nào để bạn viết truy vấn này bằng truy vấn phụ?
Các bảng đang tìm kiếm như thế này:
___parent___ (not used in this query, but exists) parentId P1 | * P2 | * P3 | * ___child___ parentId | revision P1 | 1 | * P1 | 2 | * P1 | 3 | * P2 | 2 | * P2 | 3 | * P3 | 1 | * ___result from child, the highest revision for each parentId___ P1 | 3 | * P2 | 3 | * P3 | 1 | *
Những gì tôi đã cố gắng cho đến nay:
.where(JPAExpressions.select(child.parent,child.revision).eq(subquery));
-> org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected end of subtree
và nhiều cú pháp lỗi ...
tôi sử dụng một vòng lặp bẩn, bây giờ, kể từ khi tôi đã không tìm thấy một giải pháp nào được nêu ra.
Có các khóa duy nhất trong bảng con không? –
Có, child.id và parent.parentId là các khóa chính tương ứng. (cảm ơn rất nhiều vì đã dành thời gian để trả lời :)) –