【问题标题】:I want to make this SQL to QueryDsl, what should I do?我想把这个SQL变成QueryDsl,我该怎么办?
【发布时间】:2021-07-15 06:29:22
【问题描述】:

我按日期进行了 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

【问题讨论】:

  • 欢迎来到 Stack Overflow。你的英语很好,你不应该觉得有必要为此道歉。删除子查询是否有帮助 - SELECT DATE_FORMAT(reg_date,'%Y-%m-%d') m, SUM(distinct client_ip) as count FROM request_log GROUP BY m。如果reg_date 只是一个DATE 类型,它是否需要DATE_FORMAT 围绕它(很可能不需要)? (对不起,我不知道 spring-boot,但我希望这会有所帮助)。也有美好的一天:-)
  • @danblack 感谢您的评论!英语很难写。因为我英语不好。 ???如您所说,我使用了mysql的日期功能。这不是 date_format 函数!但我仍然不知道如何解释子查询。所以,我使用了选择查询和java流的总和。我仍然觉得我需要学习更多。
  • 感谢您写英文的努力。它易于阅读并包含很好的信息。我也找不到与countDistinct 等效的sumDistinct

标签: java mysql spring-boot querydsl


【解决方案1】:

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

但我仍然不知道如何解释子查询。

所以,我使用了选择查询和 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);
}

【讨论】:

    猜你喜欢
    • 2014-03-07
    • 2020-06-23
    • 2023-04-01
    • 2012-04-27
    • 1970-01-01
    • 1970-01-01
    • 2013-11-14
    • 2021-09-28
    相关资源
    最近更新 更多