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
Eclipse IDE에서 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 프로젝트를 만드는 동안 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.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>
서비스 등급
이 모듈에는 MetaData API 초기화를 사용하여 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( );
}
}
위 프로그램을 컴파일하고 실행하면 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