JPA 2 의 조회: 유형 보안 및 대상 지향 (2)

7603 단어 자바ormjpaOO
이 글 은 인터넷 에서 번역 되 었 습 니 다.
http://www.developer.com/java/ent/article.php/3902911/Querying-in-JPA-2-Typesafe-and-Object-Oriented.htm
criteria 검색 사용 하기
criteria 조 회 를 잘 이해 하기 위해 Employee 인 스 턴 스 집합 을 가 진 Dept 실 체 를 고려 합 니 다. Employee 와 Dept 의 메타 모델 류 의 코드 는 다음 과 같 습 니 다.
 
//All Necessary Imports
@StaticMetamodel(Dept.class)
public class Dept_ {    
	public static volatile SingularAttribute<Dept, Integer> id;   
	public static volatile ListAttribute<Dept, Employee> employeeCollection;    
	public static volatile SingularAttribute<Dept, String> name;
}
//All Necessary Imports
@StaticMetamodel(Employee.class)
public class Employee_ {     
	public static volatile SingularAttribute<Employee, Integer> id;    
	public static volatile SingularAttribute<Employee, Integer> age;    
	public static volatile SingularAttribute<Employee, String> name;    
	public static volatile SingularAttribute<Employee, Dept> deptId;
}

다음 코드 세 션 은 criteria 를 보 여 줍 니 다. 검색 은 24 세 이상 의 모든 직원 을 얻 는 데 사 용 됩 니 다.
 
CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
CriteriaQuery<Employee> criteriaQuery = criteriaBuilder.createQuery(Employee.class);
Root<Employee> employee = criteriaQuery.from(Employee.class);
Predicate condition = criteriaBuilder.gt(employee.get(Employee_.age), 24);
criteriaQuery.where(condition);
TypedQuery<Employee> typedQuery = em.createQuery(criteriaQuery);
List<Employee> result = typedQuery.getResultList();

 
 대응 하 는 SQL: SELECT * FROM employee WHERE age > 24
 
CriteriaQuery 구축 실례
CriteriaQuery 대상 은 실체 형식 이나 끼 워 넣 는 형식의 Criteria 조회 에 작용 해 야 합 니 다.호출 CriteriaBuilder, createQuery Criteria Builder. createTupleQuery 획득CriteriaBuilder 는 CriteriaQuery 같 아 요. 공장 같 애.Criteria Builder 공장 류 는 Entity Manager. getCriteria Builder 를 호출 합 니 다. 혹시 Entity Manager Factory. getCriteria Builder 에서 얻 은 것 입 니 다.Employee 실체의 CriteriaQuery 대상 을 아래 방식 으로 만 듭 니 다:
 
CriteriaBuilder criteriaBuilder = emf.getCriteriaBuilder();
CriteriaQuery<Employee> criteriaQuery = cb.createQuery(Employee.class);
 
 
 
 
 
QueryRoot
Abstract Query 는 Criteria Query 입 니 다. 인터페이스의 부류.그것 은 검색 루트 를 얻 는 방법 을 제공한다.Criteria 조회 의 검색 루트 는 실체 유형 을 정의 합 니 다. 앞으로 내 비게 이 션 에 원 하 는 결 과 를 얻 을 수 있 습 니 다. 이것 은 SQL 조회 의 FROM 자구 와 유사 합 니 다.
Root 인 스 턴 스 도 유형 화 되 어 있 으 며, 검색 한 FROM 자구 에 나타 날 수 있 는 유형 을 정의 합 니 다.루트 인 스 턴 스 를 조회 하면 실체 형식 을 입력 할 수 있 습 니 다. AbstractQuery. from 방법 으로 획득.Criteria 조회, 여러 개의 조회 루트 가 있 습 니 다.Employee 실체의 조회 루트 대상 은 다음 과 같은 문법 으로 얻 을 수 있 습 니 다. 
 
Root<Employee> employee = criteriaQuery.from(Employee.class);

 필터 큐 리
 
필터 조건 은 SQL 문장의 FROM 자구 에 적 용 됩 니 다.criteria 검색 중, 검색 조건 은 Predicate 를 통 해 표현 Criteria Query 에 인 스 턴 스 적용 대상 상이 조건 들 은 사용한다. CriteriaQuery .where 방법 적용 Criteria Query 대상 상CriteriaBuilder Predicate 로 서 인 스 턴 스 공장, Predicate 대상 은 Criteria Builder 호출 을 통 해 라 는 조건 부 방법 ( equal,notEqual, gt, ge,lt, le, between, like 등) 생 성 합 니 다.Predicate 인 스 턴 스 도 Expression 을 사용 할 수 있 습 니 다. 실례 적 isNull, isNotNull 화해시키다 in 방법 획득, 복합 Predicate 문 구 는 Criteria Builder 의 and 를 사용 할 수 있 습 니 다. or andnot 방법 구축.
다음 코드 세 션 은 Predicate 를 보 여 줍 니 다. 실례 검사 연령 이 24 세 이상 인 직원 실례
Predicate condition = criteriaBuilder.gt(employee.get(Employee_.age), 24);
criteriaQuery.where(condition);

 Employee 통과 하기메타 모델 클래스 age 속성 을 경로 표현 식 이 라 고 합 니 다.age 속성 이 String 텍스트 와 비교 하면 컴 파 일 러 가 오 류 를 던 집 니 다. 이것 은 JPQL 에서 불가능 합 니 다.
조회 및 메타 모델 인 스 턴 스 가 져 오기
Entity Manager. createQuery (Criteria Query) 방법 이 호출 될 때 실행 가능 한 검색 인 스 턴 스 가 생 성 됩 니 다. 이 방법 은 지정 한 것 을 되 돌려 줍 니 다. criteria 에서 되 돌아 오 는 실제 형식의 TypedQuery 를 조회 합 니 다. 대상TypedQuery 인 터 페 이 스 는 javax. persistence. Query interface. 의 하위 형식 입 니 다.이 세 션 에서 Typed Query 지정 한 형식 정 보 는 Employee 입 니 다. getResultList 를 호출 하면 조회 가 실 행 됩 니 다. 
TypedQuery typedQuery = em.createQuery(criteriaQuery);
List result = typedQuery.getResultList();
메타 모델 인 스 턴 스 호출 EntityManager.getMetamodel 방법 획득, Entity Type < Employee > 의 메타 모델 인 스 턴 스 는 Metamodel. enity (Employee. class) 를 호출 하여 얻 을 수 있 으 며, 전송 되 었 습 니 다. CriteriaQuery.from 검색 루트 를 가 져 옵 니 다.
Metamodel metamodel = em.getMetamodel();EntityType<Employee> 
Employee_ = metamodel.entity(Employee.class);
Root<Employee> empRoot = criteriaQuery.from(Employee_);

 루트. getModel 방법 으로 메타 모델 정 보 를 얻 을 수도 있 습 니 다.유형 EntityType < Dept > 의 실례 Deptname 속성 과 getSingularAttribute 를 호출 할 수 있 습 니 다. 방법 획득, String 텍스트 와 비교:
CriteriaQuery criteriaQuery = criteriaBuilder.createQuery();
Root<Dept> dept = criteriaQuery.from(Dept.class);
EntityType<Dept> Dept_ = dept.getModel();
Predicate testCondition = criteriaBuilder.equal(dept.get(Dept_.getSingularAttribute("name", String.class)), "Ecomm");

 대응 하 는 SQL: SELECT * FROM dept WHERE name = 'Ecomm'
Expression
Expression 대상 은 검색 어의 select, where 와 having 자구 에 사 용 됩 니 다. 이 인 터 페 이 스 는 isNull, isNotNull 화해시키다 in 방법, 아래 코드 세 션 은 Expression. in 의 용법 을 보 여 줍 니 다. employe 의 연령 검 사 는 20 또는 24 입 니 다.
CriteriaQuery<Employee> criteriaQuery = criteriaBuilder .createQuery(Employee.class);
Root<Employee> employee = criteriaQuery.from(Employee.class);
criteriaQuery.where(employee.get(Employee_.age).in(20, 24));
em.createQuery(criteriaQuery).getResultList();

 대응 하 는 SQL: SELECT * FROM employee WHERE age in (20, 24)
복합 술어
Criteria Query 도 개발 자 들 이 복합 서술 어 를 작성 할 수 있 도록 합 니 다. 이 조 회 를 통 해 다음 조 회 를 위해 두 가지 조건 을 검사 할 수 있 습 니 다.우선, name 속성 이 M 으로 시작 되 는 지, 그 다음, employee 의 age 속성 이 25 인지 여부 입 니 다.논리 연산 자 and 실행 결과 기록.
criteriaQuery.where(criteriaBuilder.and(criteriaBuilder.like(employee.get(Employee_.name), "M%"), criteriaBuilder.equal(employee.get(Employee_.age), 25)));
em.createQuery(criteriaQuery).getResultList();

 대응 SQL: SELECT * FROM employee  WHERE name LIKE 'M%' AND age = 25
연결 조회
SQL 에서 여러 장의 표를 연결 하여 조회 결 과 를 얻 고 유사 한 실체 연결 은 호출 됩 니 다. From.join 실행, 연결 도움말 은 하나의 실체 에서 다른 실체 로 탐색 하여 조회 결 과 를 얻 을 수 있 습 니 다.
Root 의 join 방법 을 되 돌려 줍 니 다. Join < Dept, Employe > 유형 (SetJoin, ListJoin, MapJoin 일 수도 있 습 니 다. 혹은 Collection Join 타 입).기본 적 인 상황 에서 연결 작업 은 내부 연결 을 사용 하고 외부 연결 은 join 방법 에서 JoinType 인 자 를 LEFT 또는 Right 로 지정 하여 실현 할 수 있 습 니 다.
CriteriaQuery<Dept> cqDept = criteriaBuilder.createQuery(Dept.class);
Root<Dept> deptRoot = cqDept.from(Dept.class);
Join<Dept, Employee> employeeJoin = deptRoot.join(Dept_.employeeCollection);
cqDept.where(criteriaBuilder.equal(employeeJoin.get(Employee_.deptId).get(Dept_.id), 1));
TypedQuery<Dept> resultDept = em.createQuery(cqDept);
 
대응했어
SQL: SELECT * FROM employee e, dept d  WHERE e.deptId = d.id and d.id = 1
 

좋은 웹페이지 즐겨찾기