我是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获取结果。请给我一些建议。谢谢!
答案 0 :(得分: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 <= #{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>
我认为UNION不会工作,但我错了。你可以使用UNION。
另外,我尝试使用<![CDATA[ ......... ]]>
但是它没有用。我的Tomcat服务器说XML文件中存在错误。我不确定它是否适用于其他情况。
所以,IMO,使用&lt;将是最简单的方法。