Я использую postgresql с спящим режимом, и я хотел бы массово вставлять данные из таблицы шаблонов в другую. Как это сделать в нативном запросе, мне понятно, но в HQL я действительно не знаю, как достичь ожидаемого результата. Я использовал синтаксис из http://docs.jboss.org/hibernate/core/3.3/reference/en/html/batch.html#batch-direct, чтобы создать мой запрос.
@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)
Игра — это сущность, которая имеет длинный идентификатор, сгенерированный последовательностью.
Как видите, игры нет в моей таблице шаблонов, поэтому мне нужно будет принудительно указать идентификатор игры в моем запросе. Кто-нибудь знает, как это нужно сделать?
Заранее спасибо за ваше время, с наилучшими пожеланиями м
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;
PS: актерский состав тоже не работает.
Я думаю, вы не можете выразить этот запрос в HQL. Документация Hibernate описывает несколько ограничений запросов
, особенно@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")