Hibernate Repository Query недопустим для сервера MsSql - PullRequest
0 голосов
/ 02 мая 2019

Мы используем MsSql Server в нашем проекте.В настоящее время мы используем этот образ докера: 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 голосов
/ 02 мая 2019

Проблема была в жестко закодированной Формуле в сущности.Там я должен был изменить @Formula("(select count(id) ... на @Formula("(select count(b.id)...

0 голосов
/ 02 мая 2019

Ошибка говорит вам о проблеме здесь. если вы замените 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...