如何在没有迭代的情况下在Ibatis / MyBatis中使用NOT IN(或IN)?

时间:2013-02-08 12:17:33

标签: sql ibatis mybatis

我有这样的事情:

<select id="group" parameterClass="HashMap" resultMap="group">
       SELECT *
       FROM GROUP
       WHERE ID_USER_GROUP NOT IN (
               SELECT GS.ID_USER_GROUP
               FROM GROUP_SYSTEM GS, GROUP_USER GU
               WHERE GS.ID_USER_GROUP = GU.ID_USER_GROUP
               <dynamic prepend="WHERE">            
                     <isNotEmpty prepend="AND" property="role">
                          GU.ID_ROLE = #role#
                     </isNotEmpty>                            
                     <isNotEmpty prepend="AND" property="userID">
                           GS.ID_USER = #userID#
                     </isNotEmpty>  
               </dynamic>        
               )
   </select>

但是这会抛出一个“缺失的括号”或类似的东西。 Toad中的查询工作正常(当然没有动态内容)。

我看过this帖子,但我无法理解如何合并open / close子句。我是否需要从其他地方调用select并迭代结果?

提前致谢!

2 个答案:

答案 0 :(得分:0)

你的子查询缺少右括号

SELECT *
FROM GROUP
WHERE ID_USER_GROUP NOT IN 
    (
        SELECT GS.ID_USER_GROUP
        FROM GROUP_SYSTEM GS, GROUP_USER GU
        WHERE GS.ID_USER_GROUP = GU.ID_USER_GROUP
    ) -- <<=== HERE

但我宁愿使用JOIN而不是IN

SELECT  *
FROM    GROUP a
        LEFT JOIN
        (
            SELECT GS.ID_USER_GROUP
            FROM GROUP_SYSTEM GS, GROUP_USER GU
            WHERE GS.ID_USER_GROUP = GU.ID_USER_GROUP
        ) b ON a.ID_USER_GROUP = b.ID_USER_GROUP
WHERE   b.ID_USER_GROUP IS NULL

答案 1 :(得分:0)

启用myBatis调试并查看它生成的select语句。通常它确实有助于发现错误。

 在此示例中,您的示例似乎将生成如下查询:

   SELECT *
   FROM GROUP
   WHERE ID_USER_GROUP NOT IN (
           SELECT GS.ID_USER_GROUP
           FROM GROUP_SYSTEM GS, GROUP_USER GU
           WHERE GS.ID_USER_GROUP = GU.ID_USER_GROUP
           WHERE            
                 AND
                      GU.ID_ROLE = #role#
                 AND
                      GS.ID_USER = #userID#       
           )

尝试删除&lt; dynamic prepend =“WHERE”&gt;块。 我记得myBatis如何正确地将查询中的前置参数与使用的版本相关联。