使用sql返回的list<Object> 转成需要的实体对象

需要将Query对象setResultTransformer:
List list = session.createSQLQuery(sql)
.setResultTransformer(
Transformers.ALIAS_TO_ENTITY_MAP)
.list();
//此时,每个Object可以转换成一个Map
Map map = (Map) list.get(i);
map.get("PARENT_ID"); //这里的key 一定是 数据库对应的字段名才行
Java 中将 `List<SqlRow>` 换为 `List<Entity>` 的过程通常涉及到从数据库查询结果中提取数据并映射到特定的实体类。`SqlRow` 是常见于与数据库交互时使用的类,例如在使用 jOOQ 或某些自定义的数据访问层框架时[^1]。 以下是一个典型的实现方法,包括手动换和使用反射机制进行自动映射两种方式: ### 手动换 如果 `SqlRow` 提供了获取字段值的方法(如 `getString("column")`, `getInt("column")` 等),可以通过手动设置每个字段来构建实体对象: ```java public List<Entity> convertSqlRowsToEntities(List<SqlRow> sqlRows) { List<Entity> entities = new ArrayList<>(); for (SqlRow row : sqlRows) { Entity entity = new Entity(); entity.setId(row.getInt("id")); entity.setName(row.getString("name")); // 设置其他字段... entities.add(entity); } return entities; } ``` ### 使用反射 + 注解自动映射 如果希望避免手动配置字段映射,可以结合 Java 反射和注解机制实现自动映射。例如,通过一个通用的映射器工具类,利用字段名或自定义注解(如 `@Mapping`)来处理不同名字段的映射逻辑。 #### 示例:定义注解 ```java @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface Mapping { String value(); } ``` #### 示例:实体类定义 ```java public class Entity { @Mapping("db_id") private int id; @Mapping("db_name") private String name; // Getter and Setter } ``` #### 示例:反射映射工具类 ```java public class SqlRowMapper { public static <T> T map(SqlRow row, Class<T> clazz) throws Exception { T instance = clazz.getDeclaredConstructor().newInstance(); Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { if (field.isAnnotationPresent(Mapping.class)) { Mapping mapping = field.getAnnotation(Mapping.class); String columnName = mapping.value(); Object value = getFieldValue(row, columnName, field.getType()); field.setAccessible(true); field.set(instance, value); } else { // 默认按字段名匹配 Object value = getFieldValue(row, field.getName(), field.getType()); field.setAccessible(true); field.set(instance, value); } } return instance; } private static Object getFieldValue(SqlRow row, String columnName, Class<?> fieldType) { if (fieldType == int.class || fieldType == Integer.class) { return row.getInt(columnName); } else if (fieldType == String.class) { return row.getString(columnName); } // 支持更多类型... return null; } } ``` #### 调用示例 ```java List<Entity> entities = sqlRows.stream() .map(row -> { try { return SqlRowMapper.map(row, Entity.class); } catch (Exception e) { throw new RuntimeException(e); } }) .collect(Collectors.toList()); ``` 上述代码展示了如何基于反射机制实现 `SqlRow` 到任意实体类的自动映射,并支持通过 `@Mapping` 注解指定字段对应关系。这种方式减少了重复代码,提高了可维护性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值