首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QueryDsl按一周中的一天汇总为地图

QueryDsl按一周中的一天汇总为地图
EN

Stack Overflow用户
提问于 2020-08-22 12:21:35
回答 1查看 2.2K关注 0票数 0

我想按星期内按类别列出预订数目,例如:

代码语言:javascript
复制
| DoW   | Type   | Count |
|-----  |--------|-------|
| 1     | Store  | 3     |
| 1     | Remove | 2     |

结果应该是Map<Integer, Map<String, Long>>。我尝试过一些变体:

代码语言:javascript
复制
LocalDateTime monday = LocalDate.now().with(DayOfWeek.MONDAY).atStartOfDay();
LocalDateTime nextMonday = monday.plusDays(7);

var dayOfWeek = booking.bookingDate.dayOfWeek().subtract(1);

new JPAQuery<>(entityManager)
                .select(dayOfWeek, booking.bookingType, booking.bookingType.count())
                .from(booking)
                .where(booking.bookingDate.between(monday, nextMonday))
                .groupBy(booking.bookingDate, booking.bookingType)
                .transform(groupBy(dayOfWeek)
                        .as(map(booking.bookingType, booking.bookingType.count())));

但是,它并没有给我正确的计数(所有的数字)。我想把dayofweek放在groupby子句中,bc。我担心按LocalDateTime分组,“时间”部分会把事情搞砸,但那是行不通的。

此postgresql查询按预期工作:

代码语言:javascript
复制
select
    extract(DOW from b.book_date)-1 as dow,
    b.dtype as type,
    count(b.dtype) as cnt 
from
    booking b 
where
    b.book_date between '2020-05-11 0:0:0.000000' and '2020-05-18 0:0:0.000000'
group by
    b.book_date,
    b.dtype

编辑:

在groupBy子句中添加“groupBy”时,如下所示:

代码语言:javascript
复制
.groupBy(dayOfWeek, buchung.buchungType)

然后我得到一个例外:

代码语言:javascript
复制
javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not extract ResultSet
[...]
Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Feld 

"BOOKING0_.BOOKING_DATE" muss in der GROUP BY Liste sein
Column "BOOKING0_.BOOKING_DATE" must be in the GROUP BY list; SQL statement:
/* select dayofweek(booking.gebuchtDate) - ?1, booking.bookingType, count(booking.bookingType)
from Buchung booking
where booking.bookingDate between ?2 and ?3
group by dayofweek(booking.gebuchtDate) - ?1, booking.bookingType */ select dayofweek(booking0_.booking_date)-? as col_0_0_, booking0_.dtype as col_1_0_, count(booking0_.dtype) as col_2_0_ from booking booking0_ where booking0_.booking_date between ? and ? group by dayofweek(booking0_.booking_date)-? , booking0_.dtype [90016-200]

编辑2:

Meyling下面的回答修正了这个问题,但是我把一周中的一天从太阳卫星转换到星期一-Sun的逻辑当然是垃圾。让我们看看:

Postgresql将返回星期日(0)到星期六(6) (这似乎是ISO的方式),而java.time则从星期一(1)返回ISO8601标准格式到周日(7)。所以,除了星期天,一切基本上都是一致的。

更糟糕的是,我读到您可以在MS上更改一周的开始日期。

因为我不想麻烦这个头痛,所以我把它改成了一年中的一天,我正在用Java进行转换。由于结果集最多有7个条目,所以这并不是很糟糕:

代码语言:javascript
复制
    var dayOfYear = booking.bookingDate.dayOfYear();
    
    var res = new JPAQuery<>(entityManager)
            .from(booking)
            .where(booking.bookingDate.between(monday, nextMonday))
            .groupBy(dayOfYear, booking.bookingType)
            .transform(groupBy(dayOfYear)
                    .as(map(booking.bookingType, booking.bookingType.count())));

    return res.entrySet().stream()
            .collect(toMap(
                    e -> Year.now().atDay(e.getKey()).getDayOfWeek().getValue(),
                    Map.Entry::getValue
            ));
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-22 15:32:56

"1“是参数化的,因此在查询执行计划时,select表达式中的组与select表达式不相等。你必须用一个常量来表示1,即.subtact(Expressions.numberTemplate(Integer.class, "1"))

此外,我认为QueryDSL向DayOfWeek添加了1,使其与Java保持一致,而不是ANSI中定义的DayOfWeek。您可以考虑使用JPQLTemplates的自定义实例,该实例为DAY_OF_WEEK运算符定义了不同的标准模板(并在那里呈现常量)。在您的应用程序中,这可能是一个更安全的默认设置。

或者,在使用Hibernate 5.4.10或更高版本时,也可以使用"group别名“:在select表达式中使用dayOfWeek.as("dayOfWeekAlias"),然后在group子句中使用Expressions.numberPath(Integer.class, "dayOfWeekAlias")

代码语言:javascript
复制
new JPAQuery<>(entityManager)
        .from(booking)
        .where(booking.bookingDate.between(monday, nextMonday))
        .groupBy(Expressions.numberPath(Integer.class, "dayOfWeekAlias"), booking.bookingType)
        .transform(groupBy(dayOfWeek).as("dayOfWeekAlias")
            .as(map(booking.bookingType, booking.bookingType.count())));
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63536129

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档