JOOQ连接两个含同名列的表时fetchInto映射实体类字段异常问题
根因说明
你遇到的问题是select()不带参数等价于执行SELECT *,主表和关联表都存在名为id的字段,JDBC结果集不允许同名字段存在,后查询的表的id会覆盖前表的id值,所以映射实体时只会保留一个有效id,返回结果会随表的查询顺序变化。
可选解决方案
- 手动指定字段并设置别名
把重名的id字段分别设置和实体属性对应的别名,其余字段也按需显式声明,避免重名冲突,示例代码:dsl.select( table.ID.as("主表id对应的实体属性名"), table.其他字段, joinTable.ID.as("关联表id对应的实体属性名"), joinTable.其他字段 ) .from(table) .join(joinTable).on(joinCondition) .where(condition) .fetchInto(entityClass); - 分步映射多实体
如果你的实体是嵌套结构(主实体内包含关联表实体对象),可以先获取查询记录,分别映射到两个实体类再组装,无需设置别名:List<你的主实体类> result = dsl.select() .from(table) .join(joinTable).on(joinCondition) .where(condition) .fetch() .map(record -> { 你的主实体类 mainEntity = record.into(你的主实体类.class); 你的关联实体类 joinEntity = record.into(你的关联实体类.class); mainEntity.set关联实体属性(joinEntity); return mainEntity; }); - 修改代码生成器配置(长期方案)
如果你使用jOOQ代码生成器,可以配置字段生成策略,给所有字段自动添加表名前缀,比如table.id生成为table.table_id、joinTable.id生成为joinTable.join_table_id,从根源上避免多表查询的字段重名问题。
内容的提问来源于stack exchange,提问作者ernest
相关产品推荐
相关产品推荐

