答案 0 :(得分:2)
尝试:
INSERT INTO Tile(x,y,游戏, tileOverlay,startTile,blockWalkable, sightBlock)SELECT t.x,t.y, 演员(:游戏作为游戏),t.tileOverlay,t.startTile, t.blockWalkable,来自的t.sightBlocking TemplateQuestTile t“)
和
query.setEntity(“游戏”,游戏);
我假设您还有一个名为Tile的类,x,y,tileOverlay ...是该类的属性。来自hibernate参考文档: “INSERT语句的伪语法是:INSERT INTO EntityName properties_list select_statement中”。
关于强制转换函数,“cast(... as ...),其中第二个参数是Hibernate类型的名称”,所以它应该可以工作。
我没有尝试使用实体,但它可以使用简单类型(字节,整数......)。
答案 1 :(得分:1)
我想出了如何从jorgegm上面的评论中做到这一点,我希望这是他的实际答案,因为他的原始答案给出了NPE。
您想要像这样创建查询:
INSERT INTO Tile (x, y, game, tileOverlay, startTile, blockWalkable, sightBlocking)
SELECT t.x, t.y, g, t.tileOverlay, t.startTile, t.blockWalkable, t.sightBlocking
FROM TemplateQuestTile t,
Game g
WHERE g.id = :gameId
然后,请致电
query.setParameter("gameId", game.getId());
我使用Hibernate 3.6做到了这一点,它就像一个魅力。
答案 2 :(得分:-1)
我认为您无法在HQL中表达此查询。 Hibernate文档描述了INSERT ... SELECT ...
查询的一些限制,尤其是
select_statement可以是任何有效的HQL选择查询,但需要注意的是返回类型必须与插入所期望的类型匹配。目前,在查询编译期间检查这一点,而不是允许检查转发到数据库。
由于您无法在查询中表达:game
具有Game
类型的事实,因此此查询的编译永远不会成功。
尝试使用本机SQL查询。