【发布时间】: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