기준 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()을 통해 개체에서 가져옵니다.뿌리.