JPA-Criteria 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

名前の付いたEclipseIDEでJPAプロジェクトを作成します JPA_Eclipselink_Criteria。このプロジェクトのすべてのモジュールは次のように示されています。

エンティティの作成

名前の付いたパッケージを作成します com.tutorialspoint.eclipselink.entity‘src’ パッケージ。

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

package com.tutorialspoint.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プロジェクトのクレスト中にEclipseIDEによって作成されます。構成の詳細はユーザー指定です。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.tutorialspoint.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>

サービスクラス

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

package com.tutorialspoint.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.tutorialspoint.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( );
   }
}

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

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