使用NOT IN和UNION语句构建MyBatis查询

时间:2014-04-06 08:31:54

标签: mysql case mybatis ibatis

我是MyBatis的新手,我正在使用3.2.3版本。我需要在MySql中使用UNION和NOT IN,这是查询,它可以与Sequal Pro一起使用。

SELECT DISTINCT * FROM room WHERE roomNo NOT IN (
    SELECT roomNo FROM reservation WHERE resvStatus='DONE' AND checkout > "2014-04-27" AND checkout <= "2014-04-29"
    UNION
    SELECT roomNo FROM reservation WHERE resvStatus='DONE' AND checkin >= "2014-04-27" AND checkin < "2014-04-29"
    UNION
    SELECT roomNo FROM reservation WHERE resvStatus='DONE' AND checkin < "2014-04-27" AND checkout > "2014-04-29"
)

如果我将此查询放在MyBatis XML文件中,则会显示语法错误。

<select id="roomSearch" parameterType="map" resultType="Room">
SELECT DISTINCT * FROM room WHERE roomNo NOT IN (
    SELECT roomNo FROM reservation WHERE resvStatus='DONE' AND checkout > #{checkIn} AND checkout <= #{checkOut}
    UNION
    SELECT roomNo FROM reservation WHERE resvStatus='DONE' AND checkin >= #{checkIn} AND checkin < #{checkOut}
    UNION
    SELECT roomNo FROM reservation WHERE resvStatus='DONE' AND checkin < #{checkIn} AND checkout > #{checkOut}
)
</select>

我可以在MyBatis中使用这样的UNION吗?我在网上搜索,但找不到确切的答案。也许我需要更改我的查询以使用MyBatis获取结果。请给我一些建议。谢谢!

2 个答案:

答案 0 :(得分:2)

有两种选择:

  1. 将xml字符实体用于xml特殊符号,例如&lt;
  2. 使用字符数据块来阻止xml解析器像这样解析查询

    <select id="searchRoom" parameterType="map" resultType="Room">
    <![CDATA[
    SELECT DISTINCT * FROM room WHERE roomNo NOT IN (
        SELECT roomNo FROM reservation WHERE resvStatus="DONE" AND checkout > #{checkIn} AND checkout <= #{checkOut}  
        UNION 
        SELECT roomNo FROM reservation WHERE resvStatus="DONE" AND checkin >= #{checkIn} AND checkin < #{checkOut} 
        UNION 
        SELECT roomNo FROM reservation WHERE resvStatus="DONE" AND checkin < #{checkIn} AND checkout > #{checkOut}
     ]]>
    </select>
    

答案 1 :(得分:0)

我在几个小时的网上搜索时找到了答案。基本上,你不能使用&lt;。相反,你应该使用&amp; l t;像HTML代码一样,字符之间没有空格。下面是我刚刚测试的工作代码。

<select id="searchRoom" parameterType="map" resultType="Room">
    SELECT DISTINCT * FROM room WHERE roomNo NOT IN (
        SELECT roomNo FROM reservation WHERE resvStatus="DONE" AND checkout > #{checkIn} AND checkout &lt;= #{checkOut}  
        UNION 
        SELECT roomNo FROM reservation WHERE resvStatus="DONE" AND checkin >= #{checkIn} AND checkin &lt; #{checkOut} 
        UNION 
        SELECT roomNo FROM reservation WHERE resvStatus="DONE" AND checkin &lt; #{checkIn} AND checkout > #{checkOut}
    )
</select>

我认为UNION不会工作,但我错了。你可以使用UNION。

另外,我尝试使用<![CDATA[ ......... ]]>但是它没有用。我的Tomcat服务器说XML文件中存在错误。我不确定它是否适用于其他情况。

所以,IMO,使用&lt;将是最简单的方法。