playframework1‎ > ‎jpa‎ > ‎

SQLを実行する

概要

JPAの限界を感じたとき、ネイティブなSQLを実行したい誘惑にかられる。
JPAを使用するプロジェクトならなるべくJPQLくらいで抑えるべきなのだろうが、DB固有の関数を使用しないとパフォーマンスが出ない、といった場合もあるだろう。

SQLを実行する方法は、クエリを直接与えて実行する方法と、クエリに名前を付けて呼び出す方法(NamedNativeQuery)がある。

NamedNativeQueryは、NamedQueryと同様に起動時にプリコンパイルされるので、クエリを与えて実行するよりパフォーマンスが期待できる。
動的にクエリを組む、といった必要が無いのであればNamedNativeQueryを使うべきだろう。

NamedNativeQuery定義

で、NamedQueryでのクエリの記述方法は次の2つある。
  • エンティティクラスに対して、@NamedNativeQueryアノテーションを付与して、SQLクエリを記述しておいて呼び出す方法。
  • orm.xmlといったマッピング定義ファイルに記述しておいて呼び出す方法。

アノテーションを使う方法は、クエリの修正=ソースの変更になるので、DEVモードだとソース修正として検知、リロードしてくる。
簡易で便利ではあるが、クエリが複雑・多数になってくると管理が追いつかなくなる。

アノテーションによる記述

(そのうち記述)

マッピング定義ファイルに記述

事前にそれなりの量のJPQLクエリが想定される場合は、orm.xml方式をお勧めする。
application.conf にorm.xmlへのパスを設定する。
# conf/jpa/orm.xml を読む
jpa.default.mapping-file=jpa/orm.xml

"default"は、play1.3以降の複数DBに対応した書き方。play1.2であれば不要。

orm.xml の書き方はググれば見つかると思うが、いちおうメモ。
<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings version="2.0" xmlns="http://java.sun.com/xml/ns/persistence/orm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_2_0.xsd">

</entity-mappings>

<entity-mappings>の要素として、<named-native-query name="hogehoge"><query>SELECT p FROM ... のように記述する。
高等なxmlエディタを使えば、要素の候補が出てくると思うので割愛。

NamedQuery実行

JPA.createEntityManager() でエンティティマネージャを得る。
createNamedQuery(String) or createNamedQuery(String, Class<T>)でQueryオブジェクトを得る。
あとは、setParameter()メソッドで引数を設定、getResult()メソッドなどでクエリを実行して結果を得る。
例)
        List<User> list =
                JPA.createEntityManager().createNamedQuery("MyJPQLQuery", User.class)
                    .setParameter("arg1", 10)
                    .setParameter("arg2", 20)
                    .getResultList();