I have the next entity:
@Entity
@Table(name = "search_request_items")
public class SearchRequestItem extends LongIdEntity {
@Column(name = "date")
private Instant date;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
private User user;
@Column(name = "result_count")
private Long resultCount;
/**
* Request's text.
*/
@Column(name = "request")
private String request;
/**
* Request's quality. It may take 0 or 1.
*/
@Column(name = "quality")
private Integer quality;
...
}
Then i have the next queryDSL query, which return collection of quality avg and user count grouped by request' text:
public JPAQuery<Tuple> prepareTotalQuery() {
QSearchRequestItem requestItem = QSearchRequestItem.searchRequestItem;
QUser user = QUser.user;
NumberExpression<Double> qualityAvgExpression = requestItem.quality.avg();
NumberExpression<Long> qualityCountExpression = requestItem.user.countDistinct();
JPAQuery<Tuple> query = queryFactory
.select(qualityAvgExpression, qualityCountExpression)
.from(requestItem)
.leftJoin(requestItem.user, user)
.groupBy(requestItem.request)
.having(qualityAvgExpression.isNotNull(),
qualityCountExpression.gt(2));
return query;
}
But i need to return total avg upon this collection just like this native query:
select avg(n1.avg_quality)
from (select count(distinct user_id), avg(quality) as avg_quality
from search_request_items
group by request
having avg(quality) is not null and count(distinct user_id) > 2
) n1;
So, how to update my querydsl query to get this result?