在Play!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();以下错误中的..results,这似乎是一个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工作台中,它执行起来没有问题。
请注意,我使用RawSql是因为我需要两个以上的"OR“子句,据我所知,这是唯一的方法。
有人能帮上忙吗?
谢谢!
发布于 2012-12-21 22:10:47
找到了问题(或者至少找到了解决方案)。由于Contact是Venue的子对象,如果不指定Contact标识符,则无法映射到Contact字段(例如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();更好的是,由于例程只返回查询中匹配的"Venue“对象列表,甚至不需要包括额外的字段,所以我真正需要的是以下内容(也可以):
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();https://stackoverflow.com/questions/13977693
复制相似问题