JPAの@Queryを使った色々なSQLの書き方

spring

前回はコチラでSpring Dao JPAの@Queryの基本的な使い方を紹介しました。
今回は@QueryでのSQLの書き方を紹介していきます。

[スポンサーリンク]

@Queryへ指定できるSQLの書き方って色々な書き方ができます。例えばselectを省略することも出来ますし、パラメータの指定方法も1種類ではありません。ちょっとややこしいのですが。

というわけで、@Queryへ指定できるSQLの書き方をこの記事で紹介していきます。

Spring Dao JPAを使ったプロジェクトの作成

まずはSpring Bootを使ってSpring Dao JPAを使うためのプロジェクトを作っていきましょう。

コチラは以前紹介しましたSpring BootでMySQLに接続してJPAを使う方法です。
こちらを参考に実際に動くプロジェクトをまずは用意していきましょう。

今回使用するテーブル構成

今回JPAでselectするテーブルはこちら。
上記で紹介しました以前のブログでもこちらのテーブルを使っています。
これで準備はOKですね。

mysql> desc sample;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(11)     | NO   | PRI | NULL    | auto_increment |
| name  | varchar(20) | YES  |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
mysql> select * from sample;
+----+-----------+
| id | name      |
+----+-----------+
|  1 | test_name |
+----+-----------+

エンティティクラス

テーブルのデータを格納するクラスです。

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="sample")
public class Sample {

    @Id
    @Column(name="id")
    private Integer id;

    @Column(name="name")
    private String name;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

@Queryを使ったSQLの書き方

前置きが長くなってしまいましたが、これからが本題です!
@Queryへ指定できるSQLの書き方を1つずつ紹介していきます。

標準的なケース

こちらのSQLの書き方が@Queryを使ったクエリの書き方としては1番標準的な書き方です。
selectから始まり条件で終わるという普通のクエリと同じです。
1点気をつけないといけないのは、テーブル名とカラム名がエンティティクラスになっていることです。
これを間違って本当のテーブル名を書いてしまうと動かなくなってしまいます。

    @Query("select s from Sample s where s.id = 1 ")
    public List<Sample> findById1();

Select省略ケース

上記のSQLの"select"の部分は省略して書くことが可能です。
いきなりfrom句から書いてもOKです。

    @Query("from Sample where id = 1")
    public List<Sample> findById2();

ネイティブクエリを書くケース

一番最初のクエリはテーブル名カラム名がエンティティクラスの名前としていましたが、nativeQuery = trueを指定することで、本当のテーブル名カラム名を指定するこが可能になります。

    @Query(value="select * from sample where id = 1 ", nativeQuery = true)
    public List<Sample> findById3();

パラメータを渡すケースその1

以下のようにパラメータを渡すこともできます。
"?1"が第一引数となります。引数名ではなく第何引数を指定するというイメージです。
パラメタの渡し方は他にもあります。次のところで他方法を紹介します。

    @Query("select s from Sample s where s.id = ?1 ")
    public List<Sample> findById4(Integer id);

パラメータを渡すケースその2

上記のSQLだと第何引数を指定することでクエリにパラメータをわたしていましたが、こちらは@Paramを使うことでパラメタ名を指定することができるようになりました。
個人的にはこちらのやり方のほうが好きですね。

    @Query("select s from Sample s where s.id = :ID ")
    public List<Sample> findById5(@Param("ID")Integer id);

like検索するケース

like検索はこちらのように実装します。

    @Query("select s from Sample s where s.name like ?1%")
    public List<Sample> findByLikeName(String name);

springとjavaのバージョン

Spring Bootのバージョンは、1.5.2を使っています。
javaは、version 8です。

サンプルソース

上記のロジックを使ったサンプルプロジェクトをコチラのGitHubで公開しています。

Sample2ControllerクラスとSample2Daoクラスが今回紹介しました@Queryを実装しているクラスになります。

さいごに

色々な実装方法が用意されているので各プロジェクトによっては書き方が違っていたりするのでしょうね。
そう考えると@Queryの書き方ですが1つに統一されていたほうがわかりやすいですよね。

今は混乱しないように気をつけましょう!

それでは!