Мне нужно заполнить таблицу большим количеством данных, поэтому я не хочу искать связанные объекты, а просто поместить их числовые значения. Для этого я построю простой запрос, т.е:
INSERT INTO article_category (article_id, category_id) VALUES (2,12);
В любом случае я не могу найти способ сделать это с помощью Ebean, я пытался:
RawSql rawSql = RawSqlBuilder
.parse("INSERT INTO article_category (article_id, category_id) VALUES (2,12)")
.create();
однако это приводит к исключению:
[RuntimeException: Error parsing sql, can not find SELECT keyword in:INSERT INTO article_category (article_id, category_id) VALUES (2,12)]
Как я могу вызвать действительно сырой запрос с помощью Ebean?
На самом деле я нашел решение, это com.avaje.ebean.SqlUpdate
, который можно использовать для операторов DELETES, UPDATES и INSERTS:
SqlUpdate down = Ebean.createSqlUpdate("DELETE FROM table_name WHERE id = 123");
down.execute();
SqlUpdate insert = Ebean.createSqlUpdate("INSERT INTO article_category (article_id, category_id) VALUES (2,12)");
insert.execute();
и т.д. Конечно, он также позволяет задавать именованные параметры в запросах (пример из его API):
String s = "UPDATE f_topic set post_count = :count where id = :id"
SqlUpdate update = Ebean.createSqlUpdate(s);
update.setParameter("id", 1);
update.setParameter("count", 50);
int modifiedCount = Ebean.execute(update);
Редактировать.
Существует также аналогичный метод для выбора строк без соответствующих моделей из БД: com.avaje.ebean.SqlQuery
Вместо Ebean вы также можете использовать обычное старое соединение и оператор JDBC.
Что-то похожее на это:
Connection connection = play.db.DB.getConnection();
Statement stmt = connection.createStatement();
stmt.executeUpdate("INSERT INTO article_category (article_id, category_id) VALUES (2,12)");
stmt.close();