gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 06:53:45 26 4
gpt4 key购买 nike

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

我的完整类(class)如下所示:

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”子句,据我所知,这是唯一的方法。

有人可以帮忙吗?

谢谢!

最佳答案

找到问题(或至少找到解决方案)。由于“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();

甚至更好,因为例程只是返回在查询中匹配的“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();

关于mysql - 使用 RawSql 通过 ebean 执行 MySQL 查询时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13977693/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com