【问题标题】:Error executing MySQL query via ebean using RawSql使用 RawSql 通过 ebean 执行 MySQL 查询时出错
【发布时间】:2012-12-20 17:46:41
【问题描述】:

在剧中! 2.x 应用程序,我正在尝试使用 ebean 向 MySQL 服务器发送一个简单的查询。

我的完整课程如下:

public static List<Venue> search(String query) {
    List<Venue> matches = new ArrayList<Venue>();
    try {
        String q = query.replace(" ", "");

        String sql =    "SELECT  v.id, c.company, c.postcode \n" +
                        "FROM    venue v \n" +
                        "JOIN    contact c ON (c.id = v.id) \n" +
                        "WHERE   REPLACE(c.postcode, ' ', '') LIKE '%" + q + "%' \n" +
                        "    OR  c.company LIKE '%" + q + "%'";

        RawSql rawSql = RawSqlBuilder.unparsed(sql)
            .columnMapping("v.id", "id")
            .columnMapping("c.company", "contact.company")
            .columnMapping("c.postcode", "contact.postcode")
            .create();

        Query<Venue> eQ = Ebean.find(Venue.class);

        eQ.setRawSql(rawSql);

        matches = eQ.findList();
    }
    catch (Exception e) {
        Utils.eHandler("Venue.search(" + query + ")", e);
    }
    finally {
        return matches;
    }
}

但是,执行该行...

matches = eQ.findList();

..导致以下错误,这似乎是 MySQL 错误(?):

Query threw SQLException:Column Index out of range, 0 < 1.
Bind values:[]
Query was:
SELECT  v.id, c.company, c.postcode
FROM    venue v
JOIN    contact c ON (c.id = v.id)
WHERE   REPLACE(c.postcode, ' ', '') LIKE '%sw3%'
        OR  c.company LIKE '%sw3%'

查询本身没问题,比如我可以从错误信息中复制版本,粘贴到 MySQL Workbench 中,执行没有问题。

请注意,我使用的是 RawSql,因为我需要有超过 2 个“OR”子句,据我所知,这是唯一的方法。

有人可以帮忙吗?

谢谢!

【问题讨论】:

  • 您的查询中的“\n”是什么?
  • 它们只是换行符。我已经尝试删除它们以防万一这很愚蠢,但结果相同。
  • 你必须删除它们,因为它们可能会被 ebean 误解。
  • 好的,很高兴知道,谢谢。但是,虽然我现在已经删除了它们,但我仍然得到同样的错误。另外一点,我发现如果我发送一个返回 0 行的查询,则不会发生错误。所以它可能毕竟不是 MySQL 错误,而是将 SQL 结果映射回对象(?)的问题。
  • 请添加Venue类源码。

标签: mysql playframework playframework-2.0 ebean rawsql


【解决方案1】:

找到问题(或至少是解决方案)。由于“Contact”是“Venue”的子对象,因此如果不指定联系人标识符,则无法映射到联系人字段(例如“contact.company”)。因此,以下代码(为 contact.id 添加了适当的元素)可以正常工作:

String sql =    "SELECT  v.id, c.id, c.company, c.postcode " +
                "FROM    venue v " +
                "JOIN    contact c ON (c.id = v.id) " +
                "WHERE   REPLACE(c.postcode, ' ', '') LIKE '%" + q + "%' " +
                "    OR  c.company LIKE '%" + q + "%'";

RawSql rawSql = RawSqlBuilder.unparsed(sql)
    .columnMapping("v.id", "id")
    .columnMapping("c.id", "contact.id")
    .columnMapping("c.company", "contact.company")
    .columnMapping("c.postcode", "contact.postcode")
    .create();

甚至比这更好,因为例程只是返回查询中匹配的“地点”对象列表,甚至不需要包含其他字段,所以我真正需要的是以下内容(这也适用):

String sql =    "SELECT  v.id " +
                "FROM    venue v " +
                "JOIN    contact c ON (c.id = v.id) " +
                "WHERE   REPLACE(c.postcode, ' ', '') LIKE '%" + q + "%' " +
                "    OR  c.company LIKE '%" + q + "%'";

RawSql rawSql = RawSqlBuilder.unparsed(sql)
    .columnMapping("v.id", "id")
    .create();

【讨论】:

  • 我知道这对你来说已经是很久以前的事了,但是你还记得你在创建rawSql 后做了什么吗?如何将结果映射到模型?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-04
  • 1970-01-01
  • 1970-01-01
  • 2015-09-19
  • 1970-01-01
相关资源
最近更新 更多