Spring Data JPAのNativeQueryでIN句を使う方法




JPA

JPAにはJPQLというJPA上で使えるSQLみたいなものや、NativeQueryを使用して生のSQLを書くことができます。

生のSQLには変数を埋め込むことができるのですが、生のSQLのIN句に値を渡す方法が予想と違ったのでまとめます。

MySQLの場合

MySQLでSQLを書く場合はIN句には下記のようにカンマ区切りの値を渡すのでNativeQueryにもカンマ区切りの値を渡してみました。

SELECT
    *
FROM
    sample_table
WHERE
    id IN (1,2,3)

するとエラーになることなく先頭の値に該当するレコードだけ取得できるという現象が起きました。

いっそのことエラーにしてくれた方がわかりやすいんですけどね。。。

このせいでSQLとは関係ないところばかりソースコードを調べて無駄に時間を浪費してしまいました。

NativeQuery

JPAで実際にNativeQueryを使用するためのソースコードは下記です。Kotlinで書いてます。

val sql: String = """
                   SELECT
                        *
                    FROM
                        sample_table
                    WHERE
                        id IN (:idList)
                  """

val emf: EntityManagerFactory = EntityManagerFactory()
val em: EntityManager = emf.createEntityManager()
val query: Query = em.createNativeQuery(sql, "SampleTable)
    .setParameter("idList", idList))

val result = query.getResultList()
em.close()

:idListにはカンマ区切りの文字列ではなくintの配列を渡しています。あと最後は必ずclose()しましょう。close()しないとコネクションプーリング設定をしているのにコネクションを維持したままになってしまいます。

こういうのは知らないと無駄に時間を使ってしまうので頭の片隅に入れて起きましょう。以上です!

おすすめ書籍

JPAに関して体系的に学べる良い書籍だと思います。良くあるSpring系書籍ですとJPAは少ししか紹介がありませんが丸々一冊JPAに関してなので詳細な解説がされています。内容はJPAと他のORMとの比較から始まりセットアップ、実装の仕方まで幅広く網羅されています。これからJPAで開発を初めてみようかなと考えている方は一読することをオススメします!

Springの概要からインストール方法、各コア機能(Security, Sessionなど)の解説が体系的にまとめられています。2018年に出版されたばかりなので情報も新しいです。これからSpring Bootでアプリケーション開発をしたい方の最初に読む一冊としておすすめします。対象は初心者だけでなく上級者まで幅広く学べるので是非読んでみてください!

 

The following two tabs change content below.

髙妻智一

2013年CyberAgent新卒入社 スマホゲームを作る子会社に所属し、サーバーサイドのエンジニアを担当。2年目の終わりから新規子会社の立ち上げに参加し、サーバーサイドのエンジニアリーダーとしてサービースのリリースから運用までを担当。 2018年仮想通貨のスマホウォレットを提供するGinco Incにブロックチェーンエンジニアとして入社。






よく読まれている関連記事はこちら




コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です