【发布时间】: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