// CriteriaBuilder を使用したクエリ構築
// ここでは メールアドレス hello@example.co.jp を持つ Member の検索を行います
// CriteriaBuilder インスタンスを生成します.
final CriteriaBuilder cb = em.getCriteriaBuilder();
// CriteriaQuery インスタンスを生成します.
// ここで引数に指定するのは, クエリ実行結果として期待する型です.
final CriteriaQuery<Member> cq = cb.createQuery(Member.class);
// FROM句で指定する情報相当のものをセットします.
// クエリルートインスタンスが生成されます.
final Root<Member> member = cq.from(Member.class);
// where で条件を設定します.
// フィールドの指定にはMetamodel(エンティティ名にアンダーバーを付与したもの)が使えます.
// where member.mailaddress = 'hello@example.co.jp'
// と指定したようなイメージです
cq.where(cb.equal(member.get(Member_.mailAddress), "hello@example.co.jp"));
// クライテリアクエリが完成したら, そのインスタンスからクエリを生成します.
final TypedQuery<Member> q = em.createQuery(cq);
// ただ1つの結果となることを期待するクエリであれば
// getSingleResult メソッドを実行し結果を取得します.
final Member res = q.getSingleResult();
// CriteriaBuilder を使用したクエリ構築 その2
// リレーションシップが関係するクエリ.
// Division "DIV" に所属する Member を取得する例.
final CriteriaBuilder cb = em.getCriteriaBuilder();
final CriteriaQuery<Member> cq = cb.createQuery(Member.class);
final Root<Member> member = cq.from(Member.class);
// リレーションシップをたどるにはjoinメソッドを使用します.
final Join<Member, Division> division = member.join(Member_.division);
// 関連先のエンティティの条件指定も, 前回と同様です.
cq.where(cb.equal(division.get(Division_.name), "DIV"));
final TypedQuery<Member> q = em.createQuery(cq);
// 複数件取得できる可能性があるのでgetResultListを用います.
final List<Member> res = q.getResultList();