Java / Ebean / Query

Java / Ebean / Query

定義した Entity の形でどのようにクエリを投げるのか

基本

Finder から Query というモノが取得できるのでこれを起点に条件や最終的なアクションを決定していく

Entity に関する Query ということはもう決まっているので、Entity にこのようなショートカットを実装してもいいだろう

public static final Finder<Long, Hoge> find = new Finder<>(Hoge.class);
public static Query<Hoge> Q() {
    return find.query();
}

そうなるとこうなる

List<Piyo> piyoList = Piyo.Q()
        .where()
        .eq("name", "piyopiyo")
        .findList();
 
System.out.println(piyo.get(0).getName()); //=> piyopiyo

findList のような結果取得した後に Query オブジェクトからその時に使った SQL を getGeneratedSql で引き出すことができる。

今回のような Query では SQL はこのようになる

SELECT t0.id, t0.name FROM piyo t0 WHERE t0.name = ?

fetch

Entity に OneToMany や ManyToOne の関連が定義されていた場合その関連のフィールド名を指定することで結合を指定することができ、 その結果を結果 Entity に格納してくれる。

List<Piyo> piyoList = Piyo.Q()
        .fetch("hoge")
        .where()
        .eq("name", "piyopiyo")
        .findList();
 
System.out.println(piyo.get(0).getHoge().getName()); //=> hogehoge

Ebean としては結果は fetch をしようがしまいが getter で取得できるようになっている。 特に ManyToOne 関連では fetch をやることで一気に取ってこれる。 これは考えればわかるが、主軸になる Entity とそのレコードが結合により数が増えないからである。 なので結果1レコードを1インスタンスでマッピングできるからである。

OneToMany や fetch を用いなかった場合の関連は、遅延評価で必要となった場合に取得されるようだ。 これはパフォーマンスの問題がある。

現状自分の知る限りでは JOIN ON の条件は関連アノテーションで指定したモノで限定されて、 結合対象を選ぶ(JOIN ON の条件を細かく書く)ということはできない。

経験上、データベース設計がまともならば、結合先情報を使って結合元を限定するという状況はあるが、 結合先を限定するという要件はほぼ無いと言えるので、この制約があっても特に問題にはならない。

java/ebean/query/start.txt · 最終更新: 2021-01-14 21:26 by ore