0

我有这样的事情:

<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 中的查询工作正常(当然没有动态的东西)。

我看过这篇文章,但我不明白如何合并打开/关闭子句。我是否需要从其他地方调用选择并遍历结果?

提前致谢!

4

2 回答 2

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
于 2013-02-08T12:19:01.610 回答
0

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

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

   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#       
           )

尝试删除 <dynamic prepend="WHERE"> 块。我记得 myBatis 在查询中放置前置参数的正确程度与使用的版本有关。

于 2013-02-14T14:43:31.697 回答