JPA 和 SQL Server 的 ORDER BY 子句中的列无效

Posted

技术标签:

【中文标题】JPA 和 SQL Server 的 ORDER BY 子句中的列无效【英文标题】:Column is invalid in the ORDER BY clause with JPA and SQL Server 【发布时间】:2021-12-13 01:20:51 【问题描述】:

当我搜索这个错误时,发现了很多结果,但所有的答案都是在数据库(SQL Server)级别。但是,我在 JPA 查询(带有 order 子句的简单计数查询)和 SQL Server 数据库中遇到了这个错误。此代码适用于 mysql 数据库。

代码:

FilterBuilder builder = new FilterBuilder("FROM RuleChangeLog A  ");

  builder.startWhere();
  builder.checkAndAdd1(filters[0], "and A.action LIKE ?", filters[0] );
  builder.checkAndAdd1(filters[1], "and A.ruleName like ?", filters[1] );
  builder.checkAndAdd1(filters[2], "and A.updatedBy like ?", filters[2] );

TypedQuery<Long> countQuery = em.createQuery("select count(A) " + builder.getJPQL(), Long.class);
        builder.setParameters(countQuery);

运行countQuery.getSingleResult() 方法时出现以下错误。

原因:com.microsoft.sqlserver.jdbc.SQLServerException:列“rule_change_log.update_time”在 ORDER BY 子句中无效,因为它不包含在聚合函数或 GROUP BY 子句中。

以下是相同的转换后的数据库查询:

select count(rulechange0_.id) as col_0_0_ from rule_change_log rulechange0_ where 1=1 order by rulechange0_.update_time DESC

【问题讨论】:

这个错误是不言自明的......当你计数时你不能按列排序.​​.....因为你只期待 1 行。 所以你不能使用它来订购,因为你没有选择它(或使用像 MAX 等功能) 好的,知道了。让我尝试删除查询中的 order 子句。 【参考方案1】:

正如@Dale K 建议的那样,删除查询中的 order 子句后,它起作用了。

【讨论】:

以上是关于JPA 和 SQL Server 的 ORDER BY 子句中的列无效的主要内容,如果未能解决你的问题,请参考以下文章

JPA SQL Server 批量插入

Hibernate + JPA + jTDS + SQL Server = Unicode 问题

将 JPA Spring 引导与 SQL Server 一起使用

SQL Server MERGE 语句和 ORDER BY 子句

JPA 2.1在sql server中调用存储过程

JPA:如何映射 SQL Server 唯一标识符类型