休眠存储库查询对于MsSql Server无效

时间:2019-05-02 10:46:37

标签: sql-server hibernate spring-boot jpa

我们在Projekt中使用MsSql Server。 当前,我们使用此docker映像: mcr.microsoft.com/mssql/server:2017-CU12-ubuntu

现在我在生成查询时遇到了问题。 存储库方法如下所示: List<A> findByStatus(Status status);

(缩短的)生成查询:

select a0_.id as id1_60_,
       (SELECT count(a0_.id) from B b where b.aId = a0_.id AND b.status in ('A', 'B', 'C', 'D')) as formula4_
from dbo.A a0_
where a0_.status = ?;

此查询的执行失败:

Column 'dbo.A.ID' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

我认为这部分是错误的:... SELECT count(a0_.id) from B b ...a0_.id不是B的一部分。 如果我手动将其更改为b0_.id,它将起作用。

我的Spring配置:

spring:
  datasource:
    url: "jdbc:sqlserver://localhost:1433"
    username: sa
    password: PW12345!
  jpa:
    properties:
      hibernate:
        dialect: org.hibernate.dialect.SQLServer2012Dialect
        default_schema: "dbo"
        format_sql: true
        show-sql: true

    hibernate:
      naming:
        physical-strategy: de.a.b.c.common.persistence.MyNamingStrategy

该策略仅将所有名称格式化为大写。

    @Override
    public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) {
        if (name == null) {
            return null;
        }
        return new Identifier(name.getText().toUpperCase(), name.isQuoted());
    }

2 个答案:

答案 0 :(得分:0)

错误在这里告诉您问题所在。如果将count(a0_.id)替换为count(b.aid),则可以使用。

不过,我个人会使用正确的JOIN逻辑来重写您的查询:

SELECT a0_.id AS id1_60_,
       COUNT(b.aId) AS formula4_
FROM dbo.A AS a0_ 
     LEFT JOIN B AS b ON b.aId = a0_.id
                  AND b.status IN ('A', 'B', 'C', 'D')
WHERE a0_.status = ?
GROUP BY a0_.id;

答案 1 :(得分:0)

问题是实体中的硬编码公式。在那里,我不得不将@Formula("(select count(id) ...更改为@Formula("(select count(b.id)...