このページでは、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(); }
SimpleORM4JでのSELECT処理で使用するCriteriaクラスのメソッドに関してご説明をしていきます。
Criteriaで設定した内容がリレーショナルデータベースに問い合わせされます。
また、Criteriaメソッドは自インスタンを返却しますので、メソッドチェーンでの指定が可能です。
検索フィールドを指定するメソッドです。
指定できるものは以下になります。
■ エンティティクラスの指定 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がマッピングクラスとなります。 |
SELECT対象のテーブルを指定します。
■ 指定例 criteria.from(School.class)
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")))
検索条件(行条件)を指定します。
さまざまな式表現(Expression)を指定できます。
詳細は、式表現を参照ください。
■ 指定例(名前付きブレースホルダを使用) criteria.where(Expression.between(School.class.getDeclaredField("id"), ":min", ":max"))
グルーピングするフィールド(カラム)を指定します。
■ 指定例 criteria.groupBy( School.class.getDeclaredField("id"), Department.class.getDeclaredField("id"), Subject.class.getDeclaredField("id"))
集約したフィールド(カラム)に対する検索条件を指定します。
■ 指定例 criteria.having(Expression.greaterThan(Subject.class.getDeclaredField("id"), 30))
ソート条件を指定します。
■ 指定例 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を改善・拡張をしていきたいと考えております。
皆様からのメッセージは当方で確認をしておりますが、仕事をしながらの開発となる為、すぐにご返信・対応をすることが
出来ない場合がございます。何卒ご容赦ください。
タイトル※ | |
---|---|
メールアドレス | |
内容※ |