Tôi đã giải quyết xong nó bằng một truy vấn con tương quan:
$qb
->select('a')
->from('Article', 'a')
->join('a.views', 'v')
->orderBy('v.viewDate', 'DESC')
->setMaxResults(20)
// Only select the most recent article view for each individual article
->where('v.viewDate = (SELECT MAX(v2.viewDate) FROM ArticleView v2 WHERE v2.article = a)')
Theo cách đó, loại bỏ qua ArticleView khác với ArticleView gần đây nhất cho bất kỳ bài viết nhất định nào. Mặc dù suy đoán của tôi là điều này hoạt động khá kém so với các giải pháp SQL thô khác - bất kỳ câu trả lời nào có hiệu suất tốt hơn vẫn sẽ được đánh giá cao :).