首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用RawSql通过ebean执行MySQL查询时出错

使用RawSql通过ebean执行MySQL查询时出错
EN

Stack Overflow用户
提问于 2012-12-21 01:46:42
回答 1查看 2.8K关注 0票数 1

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

我的完整类如下所示:

代码语言:javascript
复制
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;
    }
}

但是,执行这行代码...

代码语言:javascript
复制
matches = eQ.findList();

以下错误中的..results,这似乎是一个MySQL错误(?):

代码语言:javascript
复制
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工作台中,它执行起来没有问题。

请注意,我使用RawSql是因为我需要两个以上的"OR“子句,据我所知,这是唯一的方法。

有人能帮上忙吗?

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2012-12-21 22:10:47

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

代码语言:javascript
复制
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();

更好的是,由于例程只返回查询中匹配的"Venue“对象列表,甚至不需要包括额外的字段,所以我真正需要的是以下内容(也可以):

代码语言:javascript
复制
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();
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13977693

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档