java - 为什么 ORDER BY DATEDIFF 在使用 JPA 的 SQL 服务器上引发异常?

标签 java sql-server hibernate jpa

这按预期工作:

jdbcTemplate.query(
        "select datediff(week, '2017-01-02', creation_date), count(*) from somewhere group by datediff(week, '2017-01-02', creation_date)",
        new RowMapper() {
            Object mapRow(ResultSet rs, int rowNum) throws SQLException {
                return [rs.getObject(1), rs.getObject(2)]
            }
        }
)

但是当我运行下面的查询时我得到了这个异常:

SQLServerException: Column 'somewhere.creation_date' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

查询:

def date = new Date(117, 0, 2)
jdbcTemplate.query(
        "select datediff(week, ?, creation_date), count(*) from somewhere group by datediff(week, ?, creation_date)",
        new RowMapper() {
            Object mapRow(ResultSet rs, int rowNum) throws SQLException {
                return [rs.getObject(1), rs.getObject(2)]
            }
        },
        date,
        date
)

JPA 实现是 Hibernate 5.0.11。 我在演示中使用了 Spring & Groovy,但实际代码是普通的 java + JPA Criteria,显然存在同样的问题。

为什么这不起作用?我只选择 Group By 子句中的内容。而且日期是一样的:它甚至是同一个实例!

最佳答案

不熟悉 JPA,我不能肯定地说,但我猜那些 ? 被扩展成 @P1@P2 到 SQL Server 时,您的 GROUP BY 将不同于您的 SELECT

对于 SQL Server,您的 SQL 语句可能看起来像这样:

SELECT @P1 = '2017-01-02', @P2 = '2017-01-02';
select datediff(week, @P1, creation_date), count(*) 
from somewhere 
group by datediff(week, @P2, creation_date)

关于java - 为什么 ORDER BY DATEDIFF 在使用 JPA 的 SQL 服务器上引发异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42657946/

相关文章:

java - 检索 Enum 的标签以形成列表

sql-server - LightSwitch Beta 1 寻找 SQL Express 而不是完整的 SQL 实例

.net - 使用加密连接字符串配置 ELMAH 和 SQL Server 日志记录

java - 如何在 AbstractTransactionalJUnit4SpringContextTests 测试中测试我的 DAO 更新方法?

java - 如何在 Camel HTTP 代理中获取和设置参数

java - 第一人称相机胶卷

java - Android SQlite数据检索错误

c# - 地理 将 LINESTRING 转换为 POLYGON

java - Spring 数据存储库 : Detached entity passed to persist

java - 将数据从 hibernate 层提取到另一层的最佳方法是什么?