我有这样的事情:
<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并迭代结果?
提前致谢!
答案 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如何正确地将查询中的前置参数与使用的版本相关联。