기준 API 소개
Hibernate에서 데이터베이스 쿼리를 작성하는 두 가지 방법이 있습니다.
- Hibernate 쿼리 언어
- 기준 API
오래 전에 이미 첫 번째 항목을 만났으므로 이제 Criteria API에 익숙해질 때입니다. 이것은 매우 강력한 도구이며 어느 시점에는 HQL보다 훨씬 더 인기가 있었습니다. 이제는 더 이상 인기가 없지만 일부 작업의 경우 HQL보다 확실히 더 나은 솔루션이 될 것입니다.
어쨌든 Criteria API에 익숙해지지 않고는 Hibernate를 배울 수 없습니다. 작은 예를 작성하고 분석하겠습니다. 예를 들어 데이터베이스에서 모든 직원(Employee)을 요청합니다. 우리가 얻을 수 있는 것은 다음과 같습니다.
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<Employee> critQuery = builder.createQuery(Employee.class);
Root<Employee> root = critQuery.from(Employee.class);
critQuery.select(root);
Query<Employee> query = session.createQuery(critQuery);
List<Employee> results = query.getResultList();
복잡해 보입니다. 비교를 위해 동일한 HQL 쿼리를 작성해 보겠습니다.
String hqlQuery = "from Employee";
Query<Employee> query = session.createQuery(hqlQuery);
List<Employee> results = query.getResultList();
두 예제의 마지막 두 줄은 거의 동일합니다. Query 개체를 만들고 이를 사용하여 List를 가져옵니다. 이것은 나머지 줄이 동일한 작업을 수행하고 있음을 암시합니다.
첫 번째 예의 3행과 4행을 보십시오.
Root<Employee> root = critQuery.from(Employee.class);
critQuery.select(root);
한 줄로 작성해 보겠습니다.
critQuery.select(critQuery.from(Employee.class));
아무것도 생각 나지 않습니까? 그리고 조금 다르게 색칠하면
critQuery.select(critQuery.from(Employee.class));
예, 이것은 SELECT FROM 쿼리의 까다로운 구조입니다.
Criteria API 작업의 예
더 나은 이해를 위해 몇 가지 예를 들겠습니다.
요청 1 . 급여가 10,000 이상인 모든 직원을 확보하십시오.
critQuery.select(critQuery.from(Employee.class)).where(builder.gt(root.get("salary"), 10000));
요청 2 . 급여가 50,000 미만인 모든 직원을 확보하십시오.
critQuery.select(critQuery.from(Employee.class)).where(builder.lt(root.get("salary"), 50000));
요청 3 . 직책에 "test"라는 단어가 포함된 모든 직원을 가져옵니다.
critQuery.select(critQuery.from(Employee.class)).where(builder.like(root.get("occupation"), "%test%"));
요청 4 . 급여가 10 ~ 50,000 인 모든 직원을 얻으십시오.
critQuery.select(critQuery.from(Employee.class)).where(builder.between(root.get("salary"), 10000, 50000));
요청 5 . 이름이 null인 모든 직원을 가져옵니다.
critQuery.select(critQuery.from(Employee.class)).where(builder.isNull(root.get("name")));
요청 6 . 이름이 null이 아닌 모든 직원을 가져옵니다.
critQuery.select(critQuery.from(Employee.class)).where(builder.isNotNull(root.get("name")));
쿼리를 구성하는 것은 매우 까다로운 방법입니다.
- 먼저 객체를 얻습니다.CriteriaBuilder.
- 그런 다음 이를 사용하여 개체를 만듭니다.CriteriaQuery.
- 그런 다음 부품을 추가하기 시작합니다.CriteriaQuery그리고CriteriaBuilder.
다음에 대한 매개변수를 설정하는 방법은 다음과 같습니다.
- 선택하다
- 에서
- 어디
또한 사용CriteriaBuilderWHERE에 대해 다른 조건을 구성할 수 있습니다.
Criteria API를 사용한 고급 작업
Criteria API를 사용하면 복잡한 쿼리를 구성할 수 있습니다. 그리고 이것은 좋은 소식입니다. 예를 들어 복잡한 WHERE 절이 필요합니다. 방법은 다음과 같습니다.
Predicate greaterThan = builder.gt(root.get("salary"), 1000);
Predicate testers = builder.like(root.get("occupation"), "test%");
critQuery.select(critQuery.from(Employee.class)).where(builder.or(greaterThan, testers));
OR 대신 AND를 쓰려면 마지막 줄만 변경하면 됩니다.
critQuery.select(critQuery.from(Employee.class)).where(builder.and(greaterThan, testers));
모든 것이 실제로 매우 간단합니다. 몇 가지 비교가 포함된 표를 제공하겠습니다.
SQL | 방법 | 전체 기록 |
---|---|---|
a<b | lt(a, b) | builder.lt(a, b) |
a > b | gt(a, b) | builder.gt(a, b) |
또는 b | 또는(a,b) | 빌더.또는(a, b) |
그리고 나 | 및(a,b) | builder.and(a,b) |
좋아요 b | 좋아요(a,b) | builder.like(a, b) |
(c, d) 사이 | 사이(a, c, d) | builder.between(a, c, d) |
NULL | isNull(a) | builder.isNull(a) |
NULL이 아니다 | isNotNull(a) | builder.isNotNull(a) |
모든 것이 간단하지 않습니까?
쿼리에 정렬을 어떻게 추가합니까? 매우 간단합니다.
critQuery.select( critQuery.from(Employee.class) );
critQuery.where( builder.and(greaterThan, testers) );
critQuery.orderBy( builder.asc(root.get("salary"), builder.desc(root.get("joinDate") )
당신은 단지 객체를 호출CriteriaQueryorderBy() 메서드를 호출 하고 필요한 매개변수를 전달합니다.
다음은 동일한 쿼리가 HQL에서 어떻게 보이는지 보여줍니다. 비교하다:
select * from Employee
where (…) and (…)
order by 'salary' asc, 'joinDate' desc
3가지만 기억하시면 됩니다.
- SELECT, FROM, WHERE와 같은 키 연산자는 개체에서 호출됩니다.CriteriaQuery.
- AND, OR, DESC와 같은 보조 연산자는 개체에서 호출됩니다.CriteriaBuilder.
- 필드 이름은 get()을 통해 개체에서 가져옵니다.뿌리.