【问题标题】:How to create custom INSERT INTO query in Ebean?如何在 Ebean 中创建自定义 INSERT INTO 查询?
【发布时间】:2012-10-22 18:23:58
【问题描述】:

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

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

【问题讨论】:

    标签: playframework playframework-2.0 ebean


    【解决方案1】:

    其实我找到了解决方案,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);
    

    编辑

    也有类似的方法从DB中选择没有对应模型的行:com.avaje.ebean.SqlQuery

    【讨论】:

    • 请注意,至少在 Play 2.3.x 中包含的 ebean 版本(即 3.something)中,任何包含少于三个单词的查询都将在此解决方案中失败(例如作为“锁定”)。似乎 ebean 试图在它的代码中分解查询并找到第三个单词,如果它不存在,则会引发异常,例如“字符串索引超出范围”
    • 嗯,ebean 让我很伤心——出于某种原因,在我的例子中,执行 INSERT … ON DUPLICATE KEY UPDATE … 返回值 1,这意味着一行受到影响。但由于某种原因,查询被回滚,当我手动查询时表中没有任何内容。奇怪。
    【解决方案2】:

    您也可以使用普通的旧 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();
    

    【讨论】:

    • nico:Ebean 的方法成功了,而且是相当干净的方法,无论如何感谢 JDBC 示例。
    猜你喜欢
    • 2016-07-27
    • 2019-03-22
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-06
    • 2014-03-10
    相关资源
    最近更新 更多