Hibernate HQL批量插入
我将postgresql与hibernate结合使用,我想将数据从一个模板表批量插入到另一个模板表中。我很清楚如何在本机查询中做到这一点,但在HQL中,我真的不知道如何达到预期的结果。 我使用中的语法创建查询Hibernate HQL批量插入,hibernate,insert,hql,jpa-2.0,bulk,Hibernate,Insert,Hql,Jpa 2.0,Bulk,我将postgresql与hibernate结合使用,我想将数据从一个模板表批量插入到另一个模板表中。我很清楚如何在本机查询中做到这一点,但在HQL中,我真的不知道如何达到预期的结果。 我使用中的语法创建查询 @NamedQuery(name="Tile.bulkLoadLevel", query="INSERT INTO Tile (x, y, game, tileOverlay, startTile, blockWalkable, sightBlocking)" + " SE
@NamedQuery(name="Tile.bulkLoadLevel", query="INSERT INTO Tile (x, y, game, tileOverlay, startTile, blockWalkable, sightBlocking)" +
" SELECT t.x, t.y, :game as game, t.tileOverlay, t.startTile, t.blockWalkable, t.sightBlocking from TemplateQuestTile t")
我的谢玛:
CREATE TABLE tile
(
x integer NOT NULL,
y integer NOT NULL,
blockwalkable boolean NOT NULL,
sightblocking boolean NOT NULL,
starttile boolean NOT NULL,
imagepath character varying(255) NOT NULL,
gameid bigint NOT NULL,
CONSTRAINT tile_pkey PRIMARY KEY (gameid, x, y)
);
简化了我的模板:
CREATE TABLE templatequesttile
(
x integer NOT NULL,
y integer NOT NULL,
blockwalkable boolean NOT NULL,
sightblocking boolean NOT NULL,
starttile boolean NOT NULL,
imagepath character varying(255) NOT NULL,
questname character varying(255) NOT NULL,
CONSTRAINT templatequesttile_pkey PRIMARY KEY (questname, questseries, x, y)
)
我得到以下错误:
ERROR (SessionFactoryImpl.java:435) - Error in named query: Tile.bulkLoad
org.hibernate.QueryException: number of select types did not match those for insert [INSERT INTO Tile (x, y, game, tileOverlay, startTile, blockWalkable, sightBlocking) SELECT t.x, t.y, :game, t.tileOverlay, t.startTile, t.blockWalkable, t.sightBlocking from net.hq.model.TemplateQuestTile t]
at org.hibernate.hql.ast.tree.IntoClause.validateTypes(IntoClause.java:115)
at org.hibernate.hql.ast.tree.InsertStatement.validate(InsertStatement.java:57)
at org.hibernate.hql.ast.HqlSqlWalker.postProcessInsert(HqlSqlWalker.java:715)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.insertStatement(HqlSqlBaseWalker.java:519)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:261)
游戏是一个由序列生成的具有长标识符的实体
正如您所看到的,游戏不在我的模板表中,所以我需要将游戏id强制输入我的查询中。有人知道怎么做吗
提前感谢您抽出时间,
顺致敬意,
m
PS:我如何称呼查询:
Query query = em.createNamedQuery("Tile.bulkLoadLevel");
query.setParameter("game", game.getGameid());
int copyiedEntities = query.executeUpdate();
实体:
public class Tile implements Serializable{
@Id
private int x;
@Id
private int y;
@Id
@ManyToOne
@JoinColumn(name="gameid")
private Game game;
附言:演员阵容也不行
java.lang.ExceptionInInitializeError
在
net.hq.process.db.PersistenceTest.setUp(PersistenceTest.java:58)
在
sun.reflect.NativeMethodAccessorImpl.invoke0(本机
方法)在
invoke(NativeMethodAccessorImpl.java:39)
在
reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
在
java.lang.reflect.Method.invoke(Method.java:597)
在
org.junit.runners.model.FrameworkMethod$1.runReflectCall(FrameworkMethod.java:44)
在
org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
在
org.junit.runners.model.FrameworkMethod.invokeeexplosive(FrameworkMethod.java:41)
在
org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:27)
在
org.junit.internal.runners.statements.runafter.evaluate(runafter.java:31)
在
org.junit.runners.ParentRunner.run(ParentRunner.java:236)
在
org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49)
在
org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
在
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
在
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
在
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
在
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
原因:
位于的java.lang.NullPointerException
java.lang.Class.forName0(本机)
方法)在
java.lang.Class.forName(Class.java:169)
在
org.hibernate.util.ReflectHelper.classForName(ReflectHelper.java:192)
在
org.hibernate.type.TypeFactory.heuristicType(TypeFactory.java:279)
在
org.hibernate.type.TypeFactory.heuristicType(TypeFactory.java:264)
在
org.hibernate.hql.ast.util.SessionFactoryHelper.findFunctionReturnType(SessionFactoryHelper.java:400)
在
org.hibernate.hql.ast.util.SessionFactoryHelper.findFunctionReturnType(SessionFactoryHelper.java:392)
在
org.hibernate.hql.ast.tree.MethodNode.DialogFunction(MethodNode.java:103)
在
org.hibernate.hql.ast.tree.MethodNode.resolve(MethodNode.java:78)
在
org.hibernate.hql.ast.hqlslwalker.processFunction(hqlslwalker.java:979)
在
org.hibernate.hql.antlr.HqlSqlBaseWalker.functionCall(HqlSqlBaseWalker.java:2529)
在
org.hibernate.hql.antlr.HqlSqlBaseWalker.selectExpr(HqlSqlBaseWalker.java:2129)
在
org.hibernate.hql.antlr.HqlSqlBaseWalker.selectExprList(HqlSqlBaseWalker.java:1983)
在
org.hibernate.hql.antlr.HqlSqlBaseWalker.selectClause(HqlSqlBaseWalker.java:1515)
在
org.hibernate.hql.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:586)
在
org.hibernate.hql.antlr.HqlSqlBaseWalker.insertStatement(HqlSqlBaseWalker.java:510)
在
org.hibernate.hql.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:261)
在
org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:254)
在
org.hibernate.hql.ast.QueryTranslatorImpl.docomfile(QueryTranslatorImpl.java:185)
在
org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136)
在
org.hibernate.engine.query.HQLQueryPlan.(HQLQueryPlan.java:101)
在
org.hibernate.engine.query.HQLQueryPlan.(HQLQueryPlan.java:80)
在
org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:98)
在
org.hibernate.impl.SessionFactoryImpl.checkNamedQueries(SessionFactoryImpl.java:562)
在
SessionFactoryImpl.(SessionFactoryImpl.java:424)
在
org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1385)
在
org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:954)
在
org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:891)
在
org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:57)
在
persistence.persistence.createEntityManagerFactory(persistence.java:48)
在
persistence.persistence.createEntityManagerFactory(persistence.java:32)
net.hq.util.Db.(Db.java:7)
... 还有17个
我想你不能用HQL表达这个查询。Hibernate文档描述了
INSERT。。。选择…
查询,尤其是
select_语句可以是任何有效的HQL select查询,但需要注意的是返回类型必须与insert预期的类型匹配。目前,这是在查询编译期间检查的,而不允许将检查降级到数据库
由于无法在查询中表示:game
具有game
类型,因此此查询的编译永远不会成功
尝试改用本机SQL查询。尝试使用:
插入瓷砖(x、y、游戏、,
tileOverlay,startTile,可分块行走,
目测锁定)选择t.x、t.y、,
演员阵容(:游戏即游戏),t.tileOverlay,t.startTile,
t、 可分块行走,t.视线锁定
TemplateQuestTile t“)
及
query.setEntity(“游戏”,game)
我想你也是
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());