【问题标题】:Ebean RawSql Unparsed QueryEbean RawSql 未解析查询
【发布时间】:2014-03-12 05:13:33
【问题描述】:

因此,由于 Ebean 不支持 Aggregate 功能以及其他许多功能,因此我尝试使用 RawSql 让我的复杂查询工作。此外,事实证明我需要使用.unparsed(sql),因为我的有效查询字符串不适用于.parse(sql)

这是我的代码:

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 生成以下(有效)查询:

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 Studio 中运行时会产生:

    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):

Caused by: javax.persistence.PersistenceException: Query threw SQLException:Invalid column index 0.
Bind values:[]

我尝试过使用和不使用.columnMapping,发现这个小(3 岁以上的金块here)表明您可以使用.columnMapping(),但它们必须是正确的、线性的顺序,就我而言,它们是。

【问题讨论】:

  • 顺便说一句,您是否通过 Ebean google 小组寻求帮助?这看起来更像是一个问题而不是一个问题?

标签: sql sql-server playframework playframework-2.2 ebean


【解决方案1】:

目前没有办法做到这一点。对聚合函数的支持不存在。所以我最终简化了我的查询,并通过代码(Java)过滤了其余的结果。如果您处于类似情况,请不要浪费您的时间(和您的头发!)试图让这些东西发挥作用,因为它不会。

【讨论】:

  • 我现在被困在拉头发的步骤上。您是否发现任何记录说不支持聚合功能?我无法让 max() 工作
  • 我绝对无法让它们中的任何一个工作。唯一的记录来自其他人发布类似问题的 ebean 论坛。我最终不得不放弃,并使用 Java 进行大部分处理。慢一点,是的,但必须完成。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-27
  • 2014-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多