嗨,我对spring、java 8、hibernate、mysql应用程序有一个很长的查询,除了最后一部分,它对存储中的保留项求和:
SELECT new example.package.RaktarKimutatasDTO(rk.cikkId.cikkName,
CONCAT(SUM(rk.mennyisegMe1),' ', rk.me1.unitCode, ' / ', SUM(rk.mennyisegMe2),' ', rk.me2.unitCode, ' / ', SUM(rk.mennyisegMe3),' ', rk.me3.unitCode),
CONCAT(AVG(rk.listaar), ' Ft'),
CONCAT(rk.mennyisegMe1*rk.listaar, ' Ft'),
rk.raktarId.raktarNeve, rk.cikkId.vtsz.vatCode,
SUM(CASE WHEN rk.vevoiEntity IS NOT NULL THEN rk.mennyisegMe1 ELSE 0.0 END))
FROM RaktarkeszletEntity rk
WHERE rk.raktarId.identifier IN ?1 AND rk.createDate<?2 AND (rk.bejovoszamlaEntity LIKE 'RB%' OR (rk.bejovoszamlaEntity LIKE 'BM%' AND rk.bevetel = TRUE))
GROUP BY rk.cikkId
问题是,总和(大小写…)part is总是返回0。而如果我在纯sql中使用(几乎)相同的查询,从mysql workbench,它会按预期工作,对“vevoienty”不为null的项的数量求和(因此保留数量)。db中的vevoienty字段具有int类型,也可以为null。
名为entity的字段(当然在from处使用的字段除外)不是实体,而是简单整数(以前的开发人员在命名方面也有问题)。
我试过使用更多的括号,试过“<>null”试过“vevoientity>0”等,但都没用,这个例子总是假的,其他的部分都是完美的。
为什么它在原生sql和jpql中的工作方式不同?我设置hibernate.show\u sql=true,我看到生成的sum case部分的查询与我在workbench中使用的查询一样,所以转换似乎是可以的。
普通sql(已经工作的部分被忽略),它可以工作:
SELECT rk.cikk_id, SUM(CASE WHEN rk.vevoi_tetel_id IS NOT NULL THEN rk.mennyiseg_me_1 ELSE 0 END) as reserved FROM nast_raktarkeszlet rk GROUP BY rk.cikk_id;
或:
SELECT rk.cikk_id, CONCAT(SUM(rk.mennyiseg_me_1),' ', rk.me_1, ' / ', SUM(rk.mennyiseg_me_2),' ', rk.me_2, ' / ', SUM(rk.mennyiseg_me_3),' ', rk.me_3), CONCAT(AVG(rk.listaar), ' Ft'), CONCAT(rk.mennyiseg_me_1*rk.listaar, ' Ft'), rk.raktar_id, rk.cikk_id, SUM(CASE WHEN IFNULL(rk.vevoi_tetel_id, 0) >0 THEN rk.mennyiseg_me_1 ELSE 0 END) FROM nast_raktarkeszlet rk GROUP BY rk.cikk_id
生成的查询:
select
basecikkek1_.cikk_name as col_0_0_,
concat(sum(rak0_.mennyiseg_me_1),
' ',
men2_.unit_code,
' / ',
SUM(rak0_.mennyiseg_me_2),
' ',
men3_.unit_code,
' / ',
SUM(rak0_.mennyiseg_me_3),
' ',
men4_.unit_code) as col_1_0_,
concat(avg(rak0_.listaar),
' Ft') as col_2_0_,
concat(rak0_.mennyiseg_me_1*rak0_.listaar,
' Ft') as col_3_0_,
rak5_.raktar_name as col_4_0_,
vts7_.vat_code as col_5_0_,
sum(case
when rak0_.szallitolevel_tetel_id is not null
or rak0_.kimeno_tetel_id is not null
or rak0_.vevoi_tetel_id<>0 then rak0_.mennyiseg_me_1
else 0
end) as col_6_0_
from
nast_raktarkeszlet rak0_ cross
join
nast_cikkek basecikkek1_ cross
join
nast_vtsz vts7_ cross
join
nast_units men2_ cross
join
nast_units men3_ cross
join
nast_units men4_ cross
join
nast_raktarak rak5_
where
rak0_.cikk_id=basecikkek1_.id
and basecikkek1_.vtsz=vts7_.id
and rak0_.me_1=men2_.id
and rak0_.me_2=men3_.id
and rak0_.me_3=men4_.id
and rak0_.raktar_id=rak5_.id
and (
rak0_.raktar_id in (
? , ? , ? , ?
)
)
and rak0_.create_date<?
and (
rak0_.parentid like 'RB%'
or (
rak0_.parentid like 'BM%'
)
and rak0_.bevetel=1
)
group by
rak0_.cikk_id
1条答案
按热度按时间dbf7pr2w1#
天哪,我的错。where条件排除具有非空“vevoienty”的记录