@Result 连接查询 解决别名问题

本文介绍了一个使用MyBatis框架实现的购物车查询接口。该接口通过SQL联表查询将商品与购物车信息关联,并返回包含用户ID及购物车项ID等信息的数据列表。文章详细展示了SQL语句与MyBatis注解的用法。
@Select("select p.*,c.user_id,c.id cid,c.count "
            + " from shopcar c join product p "
            + " on(c.product_id = p.id) "
            + " where c.user_id = #{id}")
@Results({ 
    @Result(property="cid", column="c.id")
})
public List<HashMap<String, Object>> myShopcar(int id);

前端接收:
cid:1
id:1
user_id:1

### Flowable 6.4.2 升级 spring-jdbc 后查询 singleResult 返回空结果问题 在升级 `spring-jdbc` 版本后,Flowable 6.4.2 中可能出现使用 `singleResult()` 查询返回空结果的问题。这通常与底层数据库查询行为的变化有关,尤其是在不同版本的 JDBC 驱动或 Spring 数据访问机制之间存在兼容性差异的情况下。 #### 1. **SQL 查询执行方式变化** Spring 5.x 及更高版本中对 `JdbcTemplate` 的默认行为进行了调整,可能导致某些原本适用于旧版的行为发生改变。例如,当查询结果为多个记录时,`singleResult()` 方法会抛出异常;而如果查询未正确映射字段或表别名不一致,则可能返回空对象。 解决此类问题的方法之一是确保 SQL 查询结构与实体类字段严格匹配,并且在自定义查询中明确指定字段别名: ```java public class CustomHistoryVariableMapper implements RowMapper<HistoryVariable> { @Override public HistoryVariable mapRow(ResultSet rs, int rowNum) throws SQLException { HistoryVariable variable = new HistoryVariable(); variable.setId(rs.getString("ID_")); variable.setProcessInstanceId(rs.getString("PROC_INST_ID_")); // 其他字段映射... return variable; } } ``` 结合引用中的自定义查询方式[^3],可使用如下代码进行查询: ```java public HistoryVariable findSingleHistoryVariable(String processInstanceId) { String sql = "SELECT * FROM ACT_HI_VAR WHERE PROC_INST_ID_ = ?"; return jdbcTemplate.queryForObject(sql, new CustomHistoryVariableMapper(), processInstanceId); } ``` #### 2. **启用 Flowable 数据库日志输出** 为了排查 `singleResult()` 返回空的原因,可以启用 Flowable 的 SQL 日志输出功能,以便查看实际执行的 SQL 语句和返回结果: ```properties logging.level.org.flowable.task.service.debugger=DEBUG logging.level.org.flowable.eventregistry=DEBUG logging.level.org.flowable.form.engine=DEBUG ``` 通过日志分析可以判断是否由于查询条件错误、字段映射缺失或连接池配置不当导致结果为空。 #### 3. **检查数据库连接配置一致性** 在升级 `spring-jdbc` 后,应确保数据源配置与 Flowable 引擎保持一致。例如,在配置文件中显式设置数据库类型、驱动类及 URL: ```properties spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://192.168.113.35:3306/flow?useUnicode=true&characterEncoding=UTF-8 spring.datasource.username=root spring.datasource.password=root ``` 同时,确保 Flowable 引擎配置中也设置了相同的数据库信息[^1]: ```java configuration.setJdbcDriver("com.mysql.cj.jdbc.Driver"); configuration.setJdbcUsername("root"); configuration.setJdbcPassword("root"); configuration.setJdbcUrl("jdbc:mysql://192.168.113.35:3306/flow"); ``` #### 4. **验证查询结果集是否非空** 在调用 `queryForObject()` 或 `singleResult()` 之前,建议先执行一次 `queryForList()` 或 `exists()` 检查是否存在预期数据,避免因数据缺失而导致空指针异常: ```java boolean exists = jdbcTemplate.queryForExists(sql, processInstanceId); if (exists) { return jdbcTemplate.queryForObject(sql, new CustomHistoryVariableMapper(), processInstanceId); } else { return null; } ``` #### 5. **适配 Flowable 自定义查询逻辑** 若使用了 Flowable 提供的 `QueryWrapper` 或自定义 SQL 进行查询,需确保字段别名与数据库表结构一致。例如: ```sql SELECT ID_ AS id, PROC_INST_ID_ AS processInstanceId FROM ACT_HI_VAR WHERE PROC_INST_ID_ IN (?) ``` 并在 Java 映射器中对应处理这些别名字段,以避免因字段名不匹配导致解析失败。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值