Java mybatis 3在foreach内选择键

Java mybatis 3在foreach内选择键,java,spring,mybatis,Java,Spring,Mybatis,MyBatis 3-春天 我想插入项目列表,并且每个项目id都必须从TVA_UPSELLADMIN_CHANNEL_SEQ.nextVal生成,但我得到了.xml验证错误,您不能在foreach中子项selectKey <insert id="insertServiceMappings" parameterType="java.util.List"> INSERT <foreach collection="list" item="channel" index="index

MyBatis 3-春天

我想插入项目列表,并且每个项目id都必须从TVA_UPSELLADMIN_CHANNEL_SEQ.nextVal生成,但我得到了.xml验证错误,您不能在foreach中子项selectKey

<insert id="insertServiceMappings" parameterType="java.util.List">

INSERT  
<foreach collection="list" item="channel" index="index" >

<selectKey keyProperty="id" resultType="long" order="BEFORE">
            SELECT TVA_UPSELLADMIN_CHANNEL_SEQ.nextVal from dual
        </selectKey>

into tva_upselladmin_channel (id,source_id, service_id, name) values (#{id}, #{channel.sourceId}, #{channel.serviceId}, #{channel.name})
</foreach>
</insert>

MyBatis在其当前版本中,或者任何与此相关的人都不允许在标记内部使用。它仅用于遍历列表

标签的MyBatis dtd验证部分如下所示:

<!ELEMENT foreach (#PCDATA | include | trim | where | set | foreach | choose | if | bind)*>
<!ATTLIST foreach
collection CDATA #REQUIRED
item CDATA #IMPLIED
index CDATA #IMPLIED
open CDATA #IMPLIED
close CDATA #IMPLIED
separator CDATA #IMPLIED
>
您的插入部分如下所示:

<select id="nextvalKey" resultType="java.lang.Integer">
     SELECT TVA_UPSELLADMIN_CHANNEL_SEQ.nextVal from dual
</select>
<insert id="insertServiceMappings" parameterType="java.util.List">
    <foreach collection="list" item="channel" index="index" >
        INSERT INTO tva_upselladmin_channel (id,source_id, service_id, name)
              VALUES ( #{id}, #{channel.sourceId}, #{channel.serviceId}, #{channel.name});
    </foreach>
</insert>

希望它能帮助我找到另一个解决方案,如下所示,它对我有效

 <insert id="insertServiceMappings" parameterType="java.util.List" useGeneratedKeys="true">
         <selectKey keyProperty="id" resultType="java.lang.Long" order="BEFORE">
                SELECT TVA_UPSELLADMIN_CHANNEL_SEQ.nextVal as id FROM DUAL
         </selectKey>    
         INSERT INTO
         tva_upselladmin_channel (id,source_id, service_id, name)
         SELECT TVA_UPSELLADMIN_CHANNEL_SEQ.nextVal, A.* from (
         <foreach collection="list" item="channel" index="index" separator="union all">
         SELECT 
           #{channel.sourceId} as source_id,
           #{channel.serviceId} as service_id,
           #{channel.name}) as name
         FROM DUAL
         </foreach> ) A
    </insert>

您不能在MyBatis中的foreach标记中使用selectKey,至少现在还不能。你的数据库是什么?是甲骨文吗?是甲骨文。我的问题是如何应对这种情况。没有意义给我的问题一个答案不是我投了反对票。我觉得这是一个完美的问题。我会详细地给你一个答案。谢谢Joege没有投票-我笑了
 <insert id="insertServiceMappings" parameterType="java.util.List" useGeneratedKeys="true">
         <selectKey keyProperty="id" resultType="java.lang.Long" order="BEFORE">
                SELECT TVA_UPSELLADMIN_CHANNEL_SEQ.nextVal as id FROM DUAL
         </selectKey>    
         INSERT INTO
         tva_upselladmin_channel (id,source_id, service_id, name)
         SELECT TVA_UPSELLADMIN_CHANNEL_SEQ.nextVal, A.* from (
         <foreach collection="list" item="channel" index="index" separator="union all">
         SELECT 
           #{channel.sourceId} as source_id,
           #{channel.serviceId} as service_id,
           #{channel.name}) as name
         FROM DUAL
         </foreach> ) A
    </insert>