Play Framework中使用Ebean与RawSql遇列索引越界异常求助
解决Ebean查询单字段时报
Column Index out of range的问题 你遇到的问题核心原因是:Ebean尝试把查询结果映射到完整的Laboratory实体,但你只查询了name这一个字段,而Laboratory实体对应数据库表有6列。当Ebean试图填充实体的其他字段时,结果集里没有对应的列数据,就会触发列索引越界的异常。
解决方案1:直接查询字符串列表(推荐,适配你的需求)
既然你只需要name列的数据,完全没必要映射整个Laboratory实体,用Ebean的findSingleAttributeList()可以直接获取字符串列表,避免实体映射的问题:
try { String sql = "SELECT name FROM Laboratory"; RawSql rawSql = RawSqlBuilder.parse(sql).create(); // 直接获取name字段的列表,跳过实体映射 List<String> names = Ebean.find(Laboratory.class) .setRawSql(rawSql) .findSingleAttributeList(); names.sort(String::compareToIgnoreCase); // 按字母顺序排序 String json = JsonHelper.toJSON(names); return ok(json).as("application/json"); } catch (JsonProcessingException e) { LOG.error("Unable to serialize sql request", e); return internalServerError(); }
解决方案2:查询实体必要字段(如果必须返回Laboratory对象)
如果你一定要返回Laboratory实体,需要确保查询的字段包含实体的必要字段(至少主键字段+name),这样Ebean才能正确完成实体映射。假设Laboratory的主键是id,修改代码如下:
try { // 包含主键id和name字段,让Ebean能完整映射实体 String sql = "SELECT id, name FROM Laboratory"; RawSql rawSql = RawSqlBuilder.parse(sql).create(); Query<Laboratory> query = Ebean.find(Laboratory.class) .setRawSql(rawSql); List<Laboratory> results = query.findList(); results.sort(Comparator.comparing(Laboratory::getName)); String json = JsonHelper.toJSON(results); return ok(json).as("application/json"); } catch (JsonProcessingException e) { LOG.error("Unable to serialize sql request", e); return internalServerError(); }
小细节优化
你的代码里query.setRawSql(rawSql).where();这行的where()是多余的(没有添加任何查询条件),直接去掉会让代码更简洁,不影响功能。
内容的提问来源于stack exchange,提问作者KroBlan
相关产品推荐
相关产品推荐

