9

我需要用大量数据填充一个表,所以我不想找到相关的对象,而只是输入它们的数值。为此,我将构建一个简单的查询,即:

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 调用真正的原始查询?

4

2 回答 2

25

实际上我找到了一个解决方案,它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

于 2012-10-23T07:00:42.850 回答
8

您还可以使用普通的旧 JDBC 连接和语句来代替 Ebean。

与此类似的东西:

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();
于 2012-10-22T20:04:06.467 回答