Jpa-criteria-api

提供:Dev Guides
移動先:案内検索

JPA-基準API

Criteria APIは、エンティティのクエリを定義するために使用される定義済みのAPIです。 これは、JPQLクエリを定義する代替方法です。 これらのクエリはタイプセーフで移植性があり、構文を変更することで簡単に変更できます。 JPQLと同様に、抽象スキーマ(スキーマの編集が簡単)および埋め込みオブジェクトに従います。 メタデータAPIは基準APIと混合され、基準クエリの永続エンティティをモデル化します。

基準APIの主な利点は、コンパイル時にエラーを早期に検出できることです。 文字列ベースのJPQLクエリとJPA基準ベースのクエリは、パフォーマンスと効率が同じです。

基準の歴史API

基準APIはJPAのすべてのバージョンに含まれているため、基準APIの各ステップはJPAの仕様で通知されます。

  • JPA 2.0(基準クエリAPI)では、クエリの標準化が開発されています。
  • JPA 2.1には、基準の更新と削除(一括更新と削除)が含まれています。

基準クエリ構造

Criteria APIとJPQLは密接に関連しており、クエリで同様の演算子を使用して設計できます。 javax.persistence.criteriaパッケージに従って、クエリを設計します。 クエリ構造とは、構文条件クエリを意味します。

次の単純な基準クエリは、データソースのエンティティクラスのすべてのインスタンスを返します。

EntityManager em = ...;
CriteriaBuilder cb = em.getCriteriaBuilder();

CriteriaQuery<Entity class> cq = cb.createQuery(Entity.class);
Root<Entity> from = cq.from(Entity.class);

cq.select(Entity);
TypedQuery<Entity> q = em.createQuery(cq);
List<Entity> allitems = q.getResultList();

このクエリは、基準を作成する基本的な手順を示しています。

  • EntityManagerインスタンスは、CriteriaBuilderオブジェクトの作成に使用されます。
  • CriteriaQueryインスタンスは、クエリオブジェクトの作成に使用されます。 このクエリオブジェクトの属性は、クエリの詳細で変更されます。
  • CriteriaQuery.fromメソッドは、クエリルートを設定するために呼び出されます。
  • CriteriaQuery.selectを呼び出して、結果リストのタイプを設定します。
  • TypedQuery <T>インスタンスは、実行のためにクエリを準備し、クエリ結果のタイプを指定するために使用されます。
  • クエリを実行するTypedQuery <T>オブジェクトのgetResultListメソッド。 このクエリはエンティティのコレクションを返し、結果はリストに保存されます。

基準APIの例

従業員データベースの例を考えてみましょう。 jpadb.employeeテーブルに次のレコードが含まれると仮定します。

Eid Ename           Salary  Deg
401 Gopal           40000   Technical Manager
402 Manisha         40000   Proof reader
403 Masthanvali     35000   Technical Writer
404     Satish          30000   Technical writer
405 Krishna         30000   Technical Writer
406 Kiran           35000   Proof reader
*JPA_Eclipselink_Criteria* という名前のEclipse IDEでJPAプロジェクトを作成します。 このプロジェクトのすべてのモジュールは次のとおりです。

エンティティの作成

*‘src’* パッケージの下に *com.finddevguides.eclipselink.entity* という名前のパッケージを作成します。

指定されたパッケージの下に Employee.java という名前のクラスを作成します。 クラスEmployeeエンティティは次のように表示されます。

package com.finddevguides.eclipselink.entity;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Employee {
   @Id
   @GeneratedValue(strategy= GenerationType.AUTO)

   private int eid;
   private String ename;
   private double salary;
   private String deg;

   public Employee(int eid, String ename, double salary, String deg) {
      super( );
      this.eid = eid;
      this.ename = ename;
      this.salary = salary;
      this.deg = deg;
   }

   public Employee( ) {
      super();
   }

   public int getEid( ) {
      return eid;
   }

   public void setEid(int eid) {
      this.eid = eid;
   }

   public String getEname( ) {
      return ename;
   }

   public void setEname(String ename) {
      this.ename = ename;
   }

   public double getSalary( ) {
      return salary;
   }

   public void setSalary(double salary) {
      this.salary = salary;
   }

   public String getDeg( ) {
      return deg;
   }

   public void setDeg(String deg) {
      this.deg = deg;
   }

   @Override
   public String toString() {
   return "Employee [eid = " + eid + ", ename = " + ename + ", salary = " + salary + ", deg = " + deg + "]";
   }
}

Persistence.xml

データベースとエンティティクラスの登録を構成するには、Persistence.xmlファイルが必要です。

Persistence.xmlは、JPAプロジェクトのクレスト時にEclipse IDEによって作成されます。 構成の詳細はユーザー指定です。 persistence.xmlファイルは次のように表示されます。

<?xml version = "1.0" encoding = "UTF-8"?>
<persistence version="2.0" xmlns = "http://java.sun.com/xml/ns/persistence"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://java.sun.com/xml/ns/persistence
   http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">

   <persistence-unit name = "Eclipselink_JPA" transaction-type = "RESOURCE_LOCAL">
      <class>com.finddevguides.eclipselink.entity.Employee</class>

      <properties>
         <property name = "javax.persistence.jdbc.url" value = "jdbc:mysql://localhost:3306/jpadb"/>
         <property name = "javax.persistence.jdbc.user" value = "root"/>
         <property name = "javax.persistence.jdbc.password" value = "root"/>
         <property name = "javax.persistence.jdbc.driver"
         value="com.mysql.jdbc.Driver"/>
         <property name = "eclipselink.logging.level" value = "FINE"/>
         <property name = "eclipselink.ddl-generation"
         value="create-tables"/>
      </properties>

   </persistence-unit>
</persistence>

サービスクラス

このモジュールには、MetaData API初期化を使用してCriteriaクエリパーツを実装するサービスクラスが含まれています。 ‘com.finddevguides.eclipselink.service’ という名前のパッケージを作成します。 CriteriaAPI.java という名前のクラスが、指定されたパッケージの下に作成されます。 DAOクラスは次のように表示されます。

package com.finddevguides.eclipselink.service;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;

import com.finddevguides.eclipselink.entity.Employee;

public class CriteriaApi {
   public static void main(String[] args) {

   EntityManagerFactory emfactory = Persistence.createEntityManagerFactory( "Eclipselink_JPA" );
   EntityManager entitymanager = emfactory.createEntityManager( );
   CriteriaBuilder criteriaBuilder = entitymanager.getCriteriaBuilder();
   CriteriaQuery<Object> criteriaQuery = criteriaBuilder.createQuery();
   Root<Employee> from = criteriaQuery.from(Employee.class);

  //select all records
   System.out.println(“Select all records”);
   CriteriaQuery<Object> select = c riteriaQuery.select(from);
   TypedQuery<Object> typedQuery = entitymanager.createQuery(select);
   List<Object> resultlist = typedQuery.getResultList();

   for(Object o:resultlist) {
      Employee e = (Employee)o;
      System.out.println("EID : " + e.getEid() + " Ename : " + e.getEname());
   }

  //Ordering the records
   System.out.println(“Select all records by follow ordering”);
   CriteriaQuery<Object> select1 = criteriaQuery.select(from);
   select1.orderBy(criteriaBuilder.asc(from.get("ename")));
   TypedQuery<Object> typedQuery1 = entitymanager.createQuery(select);
   List<Object> resultlist1 = typedQuery1.getResultList();

   for(Object o:resultlist1){
      Employee e=(Employee)o;
      System.out.println("EID : " + e.getEid() + " Ename : " + e.getEname());
   }

   entitymanager.close( );
   emfactory.close( );
   }
}

上記のプログラムをコンパイルして実行すると、次のようにEclipse IDEのコンソールパネルに出力が表示されます。

Select All records
EID : 401 Ename : Gopal
EID : 402 Ename : Manisha
EID : 403 Ename : Masthanvali
EID : 404 Ename : Satish
EID : 405 Ename : Krishna
EID : 406 Ename : Kiran
Select All records by follow Ordering
EID : 401 Ename : Gopal
EID : 406 Ename : Kiran
EID : 405 Ename : Krishna
EID : 402 Ename : Manisha
EID : 403 Ename : Masthanvali
EID : 404 Ename : Satish