首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ebean RawSql未解析查询

Ebean RawSql未解析查询
EN

Stack Overflow用户
提问于 2014-03-12 05:13:33
回答 1查看 1.4K关注 0票数 0

因此,由于Ebean不支持聚合函数以及许多其他功能,所以我使用RawSql尝试让复杂的查询工作。此外,我需要使用.unparsed(sql),因为有效的查询字符串将不能使用.parse(sql)

这是我的代码:

代码语言:javascript
复制
final String sql = "SELECT DISTINCT d.user_id, CAST(d.date as DATE) AS date," +
            " MAX(d.speed_KPH) OVER (PARTITION BY CAST(d.date as DATE)) AS maxSpeed," +
            " AVG(d.speed_KPH) OVER (PARTITION BY CAST(d.date as DATE)) AS avgSpeed" +
            " FROM Driver as d" +
            " WHERE d.date BETWEEN '" + sdf.format(from) + "' and '" + sdf.format(to) + "'" +
            " ORDER BY date DESC";

final RawSql rawSql = RawSqlBuilder.unparsed(sql)
        .columnMapping("user_id", "user.userId")
        .columnMapping("date", "message.date")
        .columnMapping("maxSpeed", "maxSpeed")
        .columnMapping("avgSpeed", "avgSpeed")
        .create();

final List<MessageAggregate> theList = Ebean.find(MessageAggregate.class).setRawSql(rawSql)
        .findList();

Ebean生成以下(有效)查询:

代码语言:javascript
复制
SELECT DISTINCT d.user_id, CAST(d.date as DATE) AS date, 
        MAX(d.speed_KPH) OVER (PARTITION BY CAST(d.date as DATE)) AS maxSpeed,
        AVG(d.speed_KPH) OVER (PARTITION BY CAST(d.date as DATE)) AS avgSpeed
    FROM Driver AS d
    WHERE d.date 
    BETWEEN '2014-01-02 09:00:00' and '2014-03-12 17:00:00' 
    ORDER BY date DESC

在MSSQL中运行时,将生成:

代码语言:javascript
复制
    user_id date    maxSpeed    avgSpeed
4   2014-02-20  74.1    1.1935294117647
311 2014-02-20  74.1    1.1935294117647
314 2014-02-20  74.1    1.1935294117647
347 2014-02-20  74.1    1.1935294117647
... etc ...

在Ebean中运行时(通过PlayFramework 2.2.2):

代码语言:javascript
复制
Caused by: javax.persistence.PersistenceException: Query threw SQLException:Invalid column index 0.
Bind values:[]

我尝试过使用和不使用.columnMapping,并发现了这个小的(3+岁的母块这里),它表明您可以使用.columnMapping(),但它们必须是正确的线性顺序,在我的例子中,它们是。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-19 19:53:02

目前没有办法做到这一点。对聚合函数的支持根本不存在。因此,我最终简化了我的查询,并通过代码(Java)完成了其余的结果过滤。如果你有类似的情况,不要浪费你的时间(和你的头发!)试着让这些东西发挥作用,因为它就是行不通。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22342553

复制
相关文章

相似问题

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