あずきみるくのあずきはニガテ - for Engineer

ひよっこプログラマがやってみたことやハマっちゃったことなど、備忘録的な感じで書いていきます。

SpringBootをEclipse、Gradleで使ってみる - (6)JPAでDB(MySQL)につなごう!*番外編*

はい、番外編です。

何がしたいのか、というと、
前回は「findAll」というメソッドでDBから全件取得を行っただけなのですが、

実はSQL文もかけるんだよ、

ということが言いたいのです。


個人的にはORまっぱーは便利なのですが、ごりごりSQL文書きたいのです。
ちょっと凝った検索をしたいと思ったら、やっぱいるもんね。

1)SQL文の定義

修正するのは、こいつ!

「EmpRepository.javaです。

こいつはインターフェースです。
で、この中に、追記してやるわけです。

package sample.hello.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;

import sample.hello.entity.Emp;

@Repository
public interface EmpRepository extends JpaRepository<Emp, Integer>{

	@Query("select e from Emp e where e.empID = ?1")
	Emp findByEmpID(Integer empID);
}

そう、

    @Query("select e from Emp e where e.empID = ?1")
	public Emp findByEmpID(Integer empID);

ここです。

新しいメソッド(インターフェースなので実装はなし)を追加してあげます。
「@Query」内に、SQL文を記述するわけです。

2)呼び出し

で、これをどうやって使うのか、というと、
Contoroller.javaで呼び出します。

こんな感じ。

Emp emp = repository.findByEmpID(2);

今回は1件だけの取得なので、こんな感じですが、複数件取得する場合は戻り値を変更するとかして対応するんでしょうな。(Iterableとか?)




!ここで注意!

わざわざエイリアス(別名)つけなくてもよくない?

と、思ったあずきは、最初こんなSQLを書いてました。

select * from Emp where empID = ?1

そしたら、

Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: * near line 1, column 8 [select * from sample.hello.entity.Emp where empID = ?1]

って怒られました。

きっと、DB名とEmp.javaクラスの区別がつかなくなっちゃったのでしょう。
(ほんと?!)

すべての事に意味はあるようです。。。

テーブルの結合とかは?っていう質問に、今はお答えできません。
ひとえに勉強不足ゆえ、です。ごめんなさい。。。

また、わかったら追記します。
ではでは。

<参考>
Spring BootからのSpring Dataを使ってみる。 - sohatach's blog