mybatis collection column 传常量

本文介绍如何在MyBatis的collection关联查询中正确使用常量参数,避免因语法错误导致的问题,并展示如何通过基础查询语句添加常量并引用。

想要在mybatis 的collection关联查询中,添加一个常量:classifyId=1作为参数,原先使用的添加方式为:

<collection property="imageList" column="{aaaId=aaa_id,classifyId='1'}"
                javaType="ArrayList"
                select="com.fsti.information.dao.ImageManageMapper.queryGoodsImage">
    </collection>

会报找不到行:”1 “的错误。

需要将关联的语句改为:

 <resultMap id="GoodsVO" type="com.fsti.aaa.bean.vo.aaaVO" >
    <collection property="imageList" column="{aaaId=aaa_id,classifyId=classifyId}"
                javaType="ArrayList"
                select="com.fsti.information.dao.ImageManageMapper.queryGoodsImage">
    </collection>
    <collection property="goodsTags" column="{goodsId = goods_id}"
                javaType="ArrayList"
                select="com.fsti.goods.dao.GoodsTagsReleMapper.queryGoodsTags">
    </collection>
  </resultMap>

基础查询的语句改为:

<select id="queryAaaVO" resultMap="aaaVO" parameterType="java.util.Map" >
    select
    <include refid="Base_Column_List" />,
    1 as classifyId
    from aaa
    where
    aaa_id=#{aaaId,jdbcType=BIGINT}
  </select>

也就是在查询时添加一句 1 as classifyId
然后,将其作为变量在column中引用即可:classifyId=classifyId

<think> 我们被要求解决MyBatis嵌套查询中参数写死的问题。根据引用内容,我们可以分析嵌套查询中参数递的方式,并找到如何避免写死参数的方法。 在MyBatis中,嵌套查询(例如使用`<collection>`或`<association>`)通常会通过`column`属性将主查询的列值递给嵌套查询。然而,有时我们希望递一个固定的值(即写死的参数)给嵌套查询。实际上,MyBatis允许我们在`column`属性中递多个参数,其中可以包括常量(即写死的值)。 根据引用[3]中的例子: ```xml <collection column="sourceGroup=source_group,appId=application_id" ... /> ``` 这里递了两个参数:`sourceGroup`(其值来自主查询的`source_group`列)和`appId`(来自主查询的`application_id`列)。但是,如果我们想递一个写死的参数,我们可以这样做: ```xml <collection column="{constantParam='constantValue', dynamicParam=id}" ... /> ``` 在嵌套查询中,我们可以通过`#{constantParam}`和`#{dynamicParam}`来引用这些参数。 因此,解决方案是: 1. 在`column`属性中,使用键值对的形式递参数,其中键是嵌套查询中使用的参数名,值可以是主查询中的列名(动态值)或者是一个常量字符串(写死的值)。 2. 在嵌套查询的SQL语句中,使用`#{参数名}`来引用这些参数。 例如,假设我们有一个嵌套查询,需要递一个固定的字符串'FIXED_VALUE'和一个动态的主键值(来自主查询的id列): ```xml <resultMap id="someResultMap" type="SomeType"> <!-- 其他映射 --> <collection property="nestedList" column="{fixedParam='FIXED_VALUE', dynamicParam=id}" select="nestedSelect" /> </resultMap> ``` 然后在嵌套查询的SQL映射中: ```xml <select id="nestedSelect" resultType="NestedType"> SELECT * FROM nested_table WHERE some_column = #{fixedParam} AND other_column = #{dynamicParam} </select> ``` 这样,我们就实现了在嵌套查询中递写死参数(常量)和动态参数。 注意:在写死字符串时,需要确保字符串用单引号括起来(如`'FIXED_VALUE'`),而在递动态列值时,直接使用列名(如`id`)。 另外,引用[1]中提到,嵌套查询会根据主查询数据进行分组,分组依据是`<resultMap>`中指定的`id`标签(或多个result标签)。因此,在递参数时,也要注意分组的问题,避免因为递的参数组合导致分组不正确。 综上所述,我们可以通过上述方法在MyBatis的嵌套查询中递写死的参数。 §§相关问题§§ 1. MyBatis嵌套查询中如何递多个参数? 2. MyBatis嵌套查询中的分组机制是怎样的? 3. 除了使用嵌套查询,MyBatis还有哪些方式实现复杂结果映射? </think>### MyBatis嵌套查询参数写死的解决方案 在MyBatis嵌套查询中,若需将参数写死(硬编码),可通过以下方式实现: #### 1. **在`<collection>`或`<association>`中使用常量值** ```xml <resultMap id="deptMap" type="com.example.vo.DataVo"> <collection column="sourceGroup='HARDCODED_VALUE'" <!-- 关键:直接写死参数值 --> property="appTypeSourceList" select="getDataShareAppTypeSourceGroupSon" /> </resultMap> ``` - **说明**:在`column`属性中使用`key='常量值'`格式直接递固定值 - **效果**:嵌套查询中`#{sourceGroup}`将始终接收`HARDCODED_VALUE` #### 2. **嵌套SQL中直接使用固定值** ```xml <select id="nestedQuery" resultType="NestedType"> SELECT * FROM nested_table WHERE fixed_column = 'FIXED_VALUE' <!-- SQL中直接硬编码 --> AND dynamic_column = #{dynamicParam} </select> ``` - **适用场景**:当仅部分参数需要固定值时 #### 3. **结合OGNL表达式(复杂场景)** ```xml <collection column="{type='CONSTANT', value='2023'}" <!-- 递类型标记和固定值 --> select="getNestedData" /> ``` 嵌套查询中解析: ```java public List<NestedData> getNestedData( @Param("type") String type, @Param("value") String value ) { if ("CONSTANT".equals(type)) { return dao.queryByFixedValue(value); // 使用固定值 } else { return dao.queryByDynamicValue(value); } } ``` ### ⚠️ 注意事项 1. **参数分组问题** 嵌套查询默认按主查询的`<id>`字段分组[^1],硬编码参数可能导致分组异常,需显式配置分组字段: ```xml <resultMap> <id column="main_id" /> <!-- 必须明确定义分组字段 --> <collection column="fixed_param='FIXED'" ... /> </resultMap> ``` 2. **动态/静态参数混合递** 引用[^3]所示格式支持混合参: ```xml <collection column="{staticParam='STATIC', dynamicParam=db_column}" select="mixedQuery" /> ``` 嵌套SQL接收: ```sql SELECT ... WHERE static_field=#{staticParam} AND dynamic_field=#{dynamicParam} ``` 3. **维护性影响** 硬编码参数会降低SQL灵活性,建议: - 仅用于**永不变化**的参数(如状态码) - 在XML注释中明确标注硬编码原因 - 优先考虑`<sql>`片段复用常量值 ### 完整示例 ```xml <resultMap id="userMap" type="User"> <id column="user_id" /> <!-- 关键分组字段 --> <collection column="{roleType='ADMIN', userId=user_id}" property="roles" select="getRolesByType" /> </resultMap> <select id="getRolesByType" resultType="Role"> SELECT * FROM roles WHERE type = #{roleType} <!-- 固定值'ADMIN' --> AND user_id = #{userId} <!-- 动态值 --> </select> ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值