Java HQL使用复杂插入生成错误查询
我需要在FK中的一个表中插入大量数据,另一个表中有两个大字段 HQL查询是:Java HQL使用复杂插入生成错误查询,java,oracle,hibernate,Java,Oracle,Hibernate,我需要在FK中的一个表中插入大量数据,另一个表中有两个大字段 HQL查询是: insert into DeviceAuthorizationEntry (id, osc, moduleName, delegateModule, functionName, groupName, owner) select concat(item0.id.uuid, '1413971469473'), item0.osc, 'aaaaaaaa', 'devices', 'view_device
insert into DeviceAuthorizationEntry (id, osc, moduleName, delegateModule, functionName, groupName, owner)
select concat(item0.id.uuid, '1413971469473'), item0.osc, 'aaaaaaaa',
'devices', 'view_devices', 'administrator', item0
from device.model.Device as item0
where item0.osc IN (:oscNameList0)
and item0.nodeTypeDefinition.QN IN (:nodeTypesList0)
and not exists (select 1 from device.model.DeviceAuthorizationEntry as auth
where auth.moduleName != 'aaaaaaa'
and auth.delegateModule != 'devices'
and auth.functionName != 'view_devices'
and auth.groupName != 'administrator'
and auth.owner != item0 )
但在Oracle上执行的是:
INSERT
INTO DeviceAuthorizationEntry
(
id,
osc,
moduleName,
delegateModule,
functionName,
groupName,
owner_uuid
)
SELECT device0_.uuid
||'1413965664136' AS col_0_0_,
device0_.osc AS col_1_0_,
'aaaaaaaa' AS col_2_0_,
'devices' AS col_3_0_,
'view_devices' AS col_4_0_,
'administrator' AS col_5_0_,
device0_.uuid AS col_6_0_
FROM dem_device device0_,
cor_noddef nodetypede1_
WHERE device0_.uuid_ndtypedef=nodetypede1_.uuid
AND 1 =1
AND (device0_.osc IN (? , ?))
AND (nodetypede1_.QN IN (? , ? , ? , ? , ? , ? , ? , ? , ?))
AND NOT (EXISTS
(SELECT 1
FROM DeviceAuthorizationEntry deviceauth2_
WHERE deviceauth2_.moduleName <>'aaaaaaaa'
AND deviceauth2_.delegateModule<>'devices'
AND deviceauth2_.functionName <>'view_devices'
AND deviceauth2_.groupName <>'administrator'
AND deviceauth2_.owner_uuid <>uuid
))
正如您在exists子查询的最后一个和中所看到的,hibernate在uuid字段前面没有别名device0\uID
Hibernate支持插入select,正如您在这里看到的那样
我不知道我错在哪里。uuid在这里真的很模糊吗?是的,正如您从HQL查询中看到的,hibernate应该将item0的别名放在uuid之前。我对HQL不是很熟悉,所以请原谅我在这里使用的词汇不正确,但将item0同时用作列名和表别名是否合法?从…中选择…,项目0。。。正如第0项,Hibernate中有一个bug:可能是你的问题是的,这个bug表明了我的问题。我尝试了建议的解决办法,但对我来说不起作用。因此,我需要找到另一种方法来执行相同的查询。