Ошибка при выполнении запроса MySQL через ebean с использованием RawSql
В игре! 2.x приложение, я пытаюсь отправить простой запрос на сервер MySQL, используя ebean.
Мой полный класс выглядит следующим образом:
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 Workbench, и он не выполняет никаких проблем.
Обратите внимание, что я использую RawSql, потому что мне нужно иметь более 2 предложений "ИЛИ", и, насколько я знаю, это единственный способ сделать это.
Кто-нибудь может помочь?
Спасибо!
1 ответ
Нашел проблему (или решение, по крайней мере). Поскольку "Контакт" является дочерним объектом "Места проведения", вы не можете сопоставить поля "Контакт" (например, "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();