MyBatis + GroovyでMapperを作っている時に良い感じでWHERE IN使いたいんですけど〜って時
MyBatisのMapperをGroovyのannotationを使って書くと何かと便利 (主に「XMLを書かなくても良い」という点で便利) なわけですが,そんな中で「WHERE IN」を利用したSELECTを @Select
annotationベースでどうやって書くのかという件です.要は SELECT * FROM users WHERE id IN (?, ... , ?)
のようにプレースホルダを利用した感じのクエリを書きたい.SQLインジェクションを防ぎたいので,その辺はORMの機構に任せてしまいたいのです.
結論から書くと,MyBatis XMLマクロの foreach
を使うのがシンプルな様子.
@Select(""" <script> SELECT * FROM users WHERE user_id IN <foreach item='userId' collection='userIds' open='(' separator=',' close=')'> #{userId} </foreach> </script> """) List<User> findUsersByIds(@Param('userIds') List<Long> userIds)
結局のところXMLを書く必要があるのだ!!!! (XMLを使うことでシンプルに済ませることが出来るのであればXMLを使ったら良いという事がわかりました).
Official doc:
http://www.mybatis.org/mybatis-3/dynamic-sql.html