我想把这个SQL做成QueryDsl,怎么办?

I want to make this SQL to QueryDsl, what should I do?

我按日期做了 SQL 统计。

这表示按日期显示的访问者总数。

select sum(r.count) from (SELECT DATE_FORMAT(reg_date,'%Y-%m-%d') m, COUNT(distinct client_ip) as count FROM request_log GROUP BY m) as r;

以下是此 SQL 的结果 [在此处输入图片描述][1]
所以,我想把这个换成QueryDSL。 我阅读了以下文档并尝试了这些。 http://www.querydsl.com/static/querydsl/3.6.3/reference/ko-KR/html_single/#alias


@Transactional
@SpringBootTest
public class QueryDslTest {
    
    @PersistenceContext
    EntityManager em;
    
    @Test
    @DisplayName("QueryDSL_TEST")
    public void testQuerydsl() throws Exception {
        JPAQueryFactory queryFactory = new JPAQueryFactory(em);
        
        QRequestLog requestLog = new QRequestLog("requestLog");
        
        StringTemplate dateFormat = Expressions.stringTemplate(
                "DATE_FORMAT({0}, {1})"
                , requestLog.regDate
                , ConstantImpl.create("%Y-%m-%d"));
    
        JPQLQuery<Long> countDistinct = JPAExpressions.select(requestLog.clientIp.countDistinct());
    
                QueryResults<Tuple> count = queryFactory
                        .select(requestLog.regDate, requestLog.clientIp.countDistinct().as("count"))
                        .from(requestLog)
                        .groupBy(dateFormat, requestLog.regDate)
                        .fetchResults();
        
//                Long fetch = queryFactory
//                        .select(Projections.fields(Long.class, ExpressionUtils.as(
//                                select(requestLog.regDate, requestLog.clientIp.countDistinct().as("c"))
//                                        .from(requestLog)
//                                        .groupBy(dateFormat, requestLog.regDate), "r")
//                                                  ))
//                        .from(requestLog)
//                        .fetchOne();
        
//        JPAQuery<Tuple> tupleJPAQuery = queryFactory
//                .select(dateFormat, countDistinct)
//                .from(requestLog)
//                .groupBy(dateFormat);
//
//        queryFactory
//                .select(tupleJPAQuery)
        
        System.out.println("count = " + count);
        
//                queryFactory
//                        .select(requestLog)
//                        .from(
//                                select(requestLog.regDate.as("d"), requestLog.clientIp.countDistinct().as("c"))
//                                .from(requestLog)
//                                .groupBy(requestLog.as("d"))
//                             )
    }
    
}```

I don't know how to use an subquery alias. 

Can you give me a hint?

  [1]: https://i.stack.imgur.com/WUMkl.jpg

我使用了mysql的日期函数。这不是 date_format 函数 !

但是我还是不知道怎么解释子查询。

所以,我使用了 select 查询和 java 流的总和。

感觉还是要多学习

@Override
@Transactional(readOnly = true)
public Long allVisitors() {
        JPAQueryFactory queryFactory = new JPAQueryFactory(getEntityManager());
        return queryFactory
                .select(requestLog.clientIp.countDistinct())
                .from(requestLog)
                .groupBy(functionDate(requestLog.regDate))
                .fetch()
                .stream()
                .reduce(0L, Long::sum);
}

private StringTemplate functionDate(DateTimePath regDate) {
        return stringTemplate("date({0})", regDate);
}