2013-02-08 2 views
0

Я что-то вроде этого:Как использовать NOT IN (или IN) в 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. Нужно ли мне вызывать выбор из другого места и повторять результаты?

Заранее благодарен!

ответ

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 
+0

О, правда? Я собираюсь попробовать это прямо сейчас. Спасибо (это хромой ..), ahahaha – Enrichman

+0

Хм, он говорит мне «команда неожиданного завершения» (или seomthing). Не могли бы вы рассказать мне, где поставить динамическую часть, пожалуйста? [время обеда! BRB] – Enrichman

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

Попробуйте удалить < динамический PREPEND = «WHERE»> блок. Как я помню, как правильно myBatis ставит параметры preend в запросе, связан с используемой версией.

Смежные вопросы