我想把这个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);
}
我按日期做了 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);
}