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でアプリケーション開発をしたい方の最初に読む一冊としておすすめします。対象は初心者だけでなく上級者まで幅広く学べるので是非読んでみてください!
髙妻智一
最新記事 by 髙妻智一 (全て見る)
- Polkadot(Substrate)のアドレスとトランザクションについて - 2023-03-09
- 【無料公開】「Goで始めるBitcoin」3章 Bitcoinノードとの通信 技術書典8 - 2020-03-08
- エンジニアがゼロから技術ブログを書くための方法をまとめました - 2019-05-25
コメントを残す