JDBI3映射JoinRow报错:未找到匹配列映射Ticket类
排查JDBI3关联映射列匹配失败的问题
1. 检查SQL查询的列别名与实体类字段的对应关系
JDBI的BeanMapper会严格按列名(或别名)匹配实体类字段。如果SQL中未给Ticket的字段添加t.前缀,或别名与实体类字段名不匹配,就会触发找不到列的异常。
正确的SQL写法示例:
SELECT t.id AS id, t.title AS title, i.id AS issue_id, i.content AS content FROM ticket t JOIN ticket_issue ti ON t.id = ti.ticket_id JOIN issue i ON ti.issue_id = i.id
避免直接使用t.*(若数据库列名与实体类字段名规则不一致),或因未加别名导致列名冲突覆盖Ticket的列。
2. 确认JoinRowMapper的注册与使用逻辑
注册JoinRowMapper时必须明确指定实体类对应的表别名,确保映射时能区分不同实体的列:
// 注册Mapper jdbi.registerRowMapper(JoinRowMapper.forTypes(Ticket.class, Issue.class).withAliases("t", "i")); // DAO接口方法 @SqlQuery("上述关联SQL语句") List<JoinRow> findTicketWithIssues(); // 结果取值 for (JoinRow row : result) { Ticket ticket = row.get(Ticket.class); Issue issue = row.get(Issue.class); }
若注册时的别名与SQL中的别名不匹配,Mapper将无法定位对应实体的列。
3. 检查实体类字段的命名匹配规则
JDBI默认采用驼峰转下划线的匹配规则(如实体类的ticketId对应数据库的ticket_id),若你的字段名与数据库列名不符合该规则,需手动指定:
在实体类字段上添加@ColumnName注解:
public class Ticket { @ColumnName("ticket_id") private Long ticketId; // 其他字段... }
也可以自定义BeanMapper的匹配策略适配你的命名规则。
4. 验证ResultSet的实际列名
通过打印ResultSet元数据,确认返回的列名是否符合预期:
ResultSet rs = ...; ResultSetMetaData meta = rs.getMetaData(); for (int i = 1; i <= meta.getColumnCount(); i++) { System.out.println("返回列名:" + meta.getColumnName(i)); }
直观查看JDBI实际获取到的列名,判断是否与实体类字段匹配。
内容的提问来源于stack exchange,提问作者EzyHoo
相关产品推荐
相关产品推荐

