SELECT

概要

このページでは、SimpleORM4Jを使用した検索処理(SELECT)に関してご説明をしていきます。
リレーショナルデータベースへの検索処理で登場するクラスは以下になります。

EntityManagerFactory EntityManagerインスタンスを生成するファクトリクラスです。
EntityManager データベースと対話するために使用されるクラスです。
リレーショナルデータベースへのコネクション毎に生成されます。
Criteria 発行するクエリの内容を表現するクラスです。
Query リレーショナルデータベースに発行するクエリを表現するクラスです。

また、SELECT処理で使用する「Criteria」クラスのメソッドは以下になります。

select 検索するフィールド(カラム)を指定するメソッドです。
from 検索するテーブルを指定するメソッドです。
join 結合テーブルとその結合方法、結合条件を指定するメソッドです。
where 検索条件(行条件)を指定するメソッドです。
groupBy グルーピングするフィールド(カラム)を指定するメソッドです。
having 検索条件(集約条件)を指定するメソッドです。
orderBy ソート条件を指定するメソッドです。

いくつかのメソッドを使用した処理の流れは以下になります。

try {
	// エンティティマネージャを生成
	EntityManager em = EntityManagerFactory.createEntityManager();
	// クライテリアを取得
	Criteria criteria = em.getCriteria();
	// クエリ内容の作成
	criteria.select(
				Department.class.getDeclaredField("id"),
				Department.class.getDeclaredField("name"),
				Department.class.getDeclaredField("schoolId"))
		  .from(Department.class)
		  .join(JoinType.LEFT, School.class,
			  Expression.equal(School.class.getDeclaredField("id"), Department.class.getDeclaredField("schoolId")))
		  .where(Expression.equal(School.class.getDeclaredField("id"), ":id"));
	// クエリを生成
	Query query = em.createQuery(criteria);
	// パラメータ設定
	query.setParameter("id", 1);
	// クエリ発行
	List<Department> resultList = (List<Department>) query.getResultList();
	System.out.println(resultList);
} catch (Exception e) {
	e.printStackTrace();
}

クエリ内容の作成(Criteria)

SimpleORM4JでのSELECT処理で使用するCriteriaクラスのメソッドに関してご説明をしていきます。
Criteriaで設定した内容がリレーショナルデータベースに問い合わせされます。
また、Criteriaメソッドは自インスタンを返却しますので、メソッドチェーンでの指定が可能です。

selectメソッド

検索フィールドを指定するメソッドです。
指定できるものは以下になります。

  • エンティティクラス
  • エンティティクラスのフィールド
  • 式表現(Expression)※ 集約関数式・別名式に限られます
■ エンティティクラスの指定
criteria.select(School.class)
■ エンティティクラスのフィールド指定例
criteria.select(
		Department.class.getDeclaredField("id"),
		Department.class.getDeclaredField("name"),
		Department.class.getDeclaredField("schoolId"))
■ 式表現(Expression)指定例
criteria.select(
		Expression.as(Expression.count("*"), "CNT"),
		Expression.as(Expression.count(School.class.getDeclaredField("id")), "CNT_SCHOOL"),
		Expression.as(Expression.sum(School.class.getDeclaredField("id")), "SUM_SCHOOL"),
		Expression.as(Expression.avg(School.class.getDeclaredField("id")), "AVG_SCHOOL"),
		Expression.as(Expression.max(Department.class.getDeclaredField("schoolId")), "MAX_SCHOOL"),
		Expression.as(Expression.min(Subject.class.getDeclaredField("departmentId")), "MIN_DEPARTMENT"))

リレーショナルデータベースのROWデータがマッピングされるクラスですが、selectメソッドでの指定によって判定がされます。

エンティティクラスのみ指定された場合 指定されたエンティティクラスがマッピングクラスとなります。
単一のエンティティクラスの複数フィールド(単一フィールド含む)指定の場合 指定されたエンティティクラスがマッピングクラスとなります。
上記以外 Mapがマッピングクラスとなります。

fromメソッド

SELECT対象のテーブルを指定します。

■ 指定例
criteria.from(School.class)

joinメソッド

joinメソッドは、結合テーブルとその結合方法、結合条件を指定します。

第1引数 結合種別(JoinType列挙体)
1. INNER(内部結合)
2. LEFT(左外部結合)
3. RIGHT(右外部結合)
4. CROSS(クロス結合)
第2引数 結合テーブル(クラス)
第3引数 結合条件(Expression)
■ 指定例
criteria.from(School.class)
    	  .join(JoinType.INNER, Department.class,
			  Expression.equal(School.class.getDeclaredField("id"), Department.class.getDeclaredField("schoolId")))
    	  .join(JoinType.INNER, Subject.class,
			  Expression.equal(Department.class.getDeclaredField("id"), Subject.class.getDeclaredField("departmentId")))

whereメソッド

検索条件(行条件)を指定します。
さまざまな式表現(Expression)を指定できます。
詳細は、式表現を参照ください。

■ 指定例(名前付きブレースホルダを使用)
criteria.where(Expression.between(School.class.getDeclaredField("id"), ":min", ":max"))

groupByメソッド

グルーピングするフィールド(カラム)を指定します。

■ 指定例
criteria.groupBy(
		School.class.getDeclaredField("id"),
		Department.class.getDeclaredField("id"),
		Subject.class.getDeclaredField("id"))

havingメソッド

集約したフィールド(カラム)に対する検索条件を指定します。

■ 指定例
criteria.having(Expression.greaterThan(Subject.class.getDeclaredField("id"), 30))

orderByメソッド

ソート条件を指定します。

■ 指定例
criteria.orderyBy(
		Expression.asc(School.class.getDeclaredField("id")),
		Expression.desc(Department.class.getDeclaredField("id")))

クエリメソッド

Criteriaの内容で生成されたクエリ(Query)のメソッドには以下があります。

getSingleResult 検索結果の最初の1件を取得します。
getResultList 検索結果の全件をリストで取得します。
■ 指定例
Query query = em.createQuery(criteria);
List<Department> resultList = (List<Department>) query.getResultList();

ご意見・ご感想・バグ報告

×

SimpleORM4Jへのご意見やご感想がございましたら、メッセージをお願い致します。
また、SimpleORM4Jを使用して頂きまして、バグがございましたらご連絡を頂けると助かります。
皆様からのご意見・ご感想をもとに、SimpleORM4Jを改善・拡張をしていきたいと考えております。
皆様からのメッセージは当方で確認をしておりますが、仕事をしながらの開発となる為、すぐにご返信・対応をすることが 出来ない場合がございます。何卒ご容赦ください。

※印は必須です
タイトル
メールアドレス
内容