HQL批量插入

时间:2011-01-20 18:43:10

标签: hibernate insert hql jpa-2.0 bulk

3 个答案:

答案 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查询。