我们在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());
}
答案 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)...