๊ทธ๋ฃนํ ๋ฐ ์ง๊ณ ๊ธฐ๋ฅ
Criteria API์ ๊ฐ๋จํ ์์ฒญ์ ํ๋ ๋ฐฉ๋ฒ์ ์ด๋ฏธ ์์๋์ต๋๋ค. ๋ ๋ณต์กํ ์ฟผ๋ฆฌ๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์๋ฅผ ๋ค์ด ํ์ฌ์ ์ง์ ์๋ฅผ ํ์ธํ๋ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๋ ค๊ณ ํฉ๋๋ค. HQL์์๋ ๋ค์๊ณผ ๊ฐ์ด ํ์๋ฉ๋๋ค.
select count(*) from Employee
๊ทธ๋ฆฌ๊ณ Criteria API์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
CriteriaQuery<Long> critQuery = builder.createQuery(Long.class);
critQuery.select(builder.count(critQuery.from(Employee.class)));
์์ ํ Java ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<Long> critQuery = builder.createQuery(Long.class);
critQuery.select(builder.count(critQuery.from(Employee.class)));
Query<Long> query = session.createQuery(critQuery);
Long count = query.getSingleResult();
HQL์ ์ฌ์ฉํด๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค.
String hqlQuery = "select count(*) from Employee";
Query<Long> query = session.createQuery(hqlQuery);
Long count = query.getSingleResult();
์ด์ ํ์ฌ์ ํ๊ท ๊ธ์ฌ๋ฅผ ๊ณ์ฐํด ๋ด ์๋ค. HQL ์ฟผ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
select avg(salary) from Employee
๊ทธ๋ฆฌ๊ณ Criteria API์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
CriteriaQuery<Double> critQuery = builder.createQuery(Double.class);
critQuery.select(builder.avg( critQuery.from(Employee.class).get("salary")));
์์ ํ Java ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<Double> critQuery = builder.createQuery(Double.class);
critQuery.select(builder.avg( critQuery.from(Employee.class).get("salary")));
Query<Double> query = session.createQuery(critQuery);
Double avgSalary = query.getSingleResult();
๊ธฐ์ค ์ ๋ฐ์ดํธ
ํ ์ด๋ธ ์์ ์ ํ ์ด๋ธ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ๋งํผ ์ฝ์ต๋๋ค. ์ด๋ฅผ ์ํด CriteriaBuilder์๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ createCriteriaUpdate() ๋ผ๋ ํน์ ๋ฉ์๋๊ฐ ์์ต๋๋ค.๊ธฐ์ค ์ ๋ฐ์ดํธ<T>๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํฐํฐ๋ฅผ ์ ๋ฐ์ดํธํ๋ ์ ๋๋ค.
10,000 ๋ฏธ๋ง์๋ฐ๋ ์ง์์ ๊ธ์ฌ๋ฅผ ์ธ์ํฉ์๋ค. ์ด HQL ์ฟผ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
update Employee set salary = salary+20000 where salary<=10000
Criteria API์์๋ ๋ค์๊ณผ ๊ฐ์ด ํ์๋ฉ๋๋ค.
CriteriaUpdate<Employee> criteriaUpdate = builder.createCriteriaUpdate(Employee.class);
Root<Employee> root = criteriaUpdate.from(Employee.class);
criteriaUpdate.set("salary", "salary+20000");
criteriaUpdate.where(builder.lt(root.get("salary"), 10000));
Transaction transaction = session.beginTransaction();
session.createQuery(criteriaUpdate).executeUpdate();
transaction.commit();
๊ธฐ์ค์ญ์
๋ ์ฝ๋๋ฅผ ์ญ์ ํ๋ ๊ฒ์ด ๋ณ๊ฒฝํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ์ฝ์ต๋๋ค. ์ด๋ฅผ ์ํด ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ createCriteriaDelete() ํน์ ๋ฉ์๋๊ฐ ์์ต๋๋ค.๊ธฐ์ค์ญ์ <T>.
๊ฐ์น๊ฐ ์๋ ๋ชจ๋ ์ง์์ ์ญ๊ฐํฉ์๋ค. ๊ธ์ฌ๊ฐ 10,000 ๋ฏธ๋ง์ ๋๋ค. ์ด HQL ์ฟผ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
delete from Employee where salary<=10000
Criteria API์์๋ ๋ค์๊ณผ ๊ฐ์ด ํ์๋ฉ๋๋ค.
CriteriaDelete<Employee> criteriaDelete = builder.createCriteriaDelete(Employee.class);
Root<Employee> root = criteriaDelete.from(Employee.class);
criteriaDelete.where(builder.lt(root.get("salary"), 10000));
Transaction transaction = session.beginTransaction();
session.createQuery(criteriaDelete).executeUpdate();
transaction.commit();
Criteria API์ ์ด์
๊ทธ๋ ๋ค๋ฉด Criteria API์ ์ด์ ์ ๋ฌด์์ ๋๊น? ์ฟผ๋ฆฌ๋ ๋ฒ๊ฑฐ๋กญ์ต๋๋ค. HQL์ ํ์คํ ๋ ์ปดํฉํธํ ๊ฒ์ ๋๋ค.
์ฒซ์งธ, ๋งค๊ฐ๋ณ์๋ฅผ ์ ๋ฌํด์ผ ํ๋ ๊ฒฝ์ฐ HQL ์ฟผ๋ฆฌ๋ ๊ทธ๋ ๊ฒ ์งง์ง ์์ต๋๋ค. ๋น๊ตํ๋ค:
๊ธ์ฌ๊ฐ 10,000 ๋ฏธ๋ง์ธ ์ง์ ์๋ฅผ ๊ณ ๋ คํฉ๋๋ค. |
---|
HQL |
|
๊ธฐ์ค API |
|
๋์งธ, ์ฟผ๋ฆฌ๋ฅผ ๋์ ์ผ๋ก ๊ตฌ์ฑํด์ผ ํ๋ ์ํฉ์ด ์์ฃผ ๋ฐ์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด ์ง์, ์ํํธ ๋ฑ์ ํํฐ๋งํ๋ ์น ํ์ด์ง๊ฐ ์์ต๋๋ค. ์ผ๋ถ ๋งค๊ฐ ๋ณ์๊ฐ ์ฌ์ฉ์์๊ฒ ์ค์ํ์ง ์์ ๊ฒฝ์ฐ ๋จ์ํ ํ์ํ์ง ์์ต๋๋ค. ๋ฐ๋ผ์ ๋์ ์๋ฒ์ null์ด ์ ๋ฌ๋ฉ๋๋ค.
๊ทํ์ ์๋ฌด๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ํน์ ์ง์ (์ง์ ), ๊ธ์ฌ(๊ธ์ฌ) ๋ฐ ๊ณ ์ฉ ์ฐ๋(YEAR(join_date))๋ฅผ ๊ฐ์ง ์ง์์ ์ ํํ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ๋งค๊ฐ ๋ณ์ ๊ฐ์ด null์ด๋ฉด ํํฐ์์ ์ฌ์ฉํ์ง ๋ง์ญ์์ค.
๊ทธ๋ฌ๋ฉด HQL ์ฟผ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ด ํ์๋ฉ๋๋ค.
from Employee
where (occupation = :ocp)
and (salary = :sal)
and ( YEAR(join_date) = :jny)
๊ทธ๋ฌ๋ "jny" ๋งค๊ฐ๋ณ์๊ฐ null์ธ ๊ฒฝ์ฐ ์์ฒญ์ด ๋ค์๊ณผ ๊ฐ๊ธฐ๋ฅผ ์ํ๊ธฐ ๋๋ฌธ์ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ์ง ์์ต๋๋ค.
from Employee
where (occupation = :ocp)
and (salary = :sal)
null์ ๋ํ ๋งค๊ฐ ๋ณ์๋ฅผ ํ์ธํ์ฌ ์์ฒญ์ ๋ค์ ์์ฑํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋ํ๋ฉ๋๋ค.
from Employee
where (occupation = :ocp or :ocp is null)
and (salary = :sal or :sal is null)
and ( YEAR(join_date)= :jny or :jny is null)
ํ์ค์ด ์ด๋ป๊ฒ ๋ ๋ณต์กํด์ง๋์ง ๋ณด์ญ๋๊น? ํ์ค์ ์ข ์ข ์ด๋ ์ต๋๋ค :)
๊ทธ๋ฌ๋ ํํฐ๋ ํจ์ฌ ๋ ๋ณต์กํ ์ ์์ต๋๋ค. "๊ตฌ๋งค"๋ผ๋ ๋จ์ด๊ฐ ํฌํจ๋ ์์ ์ด ์๋ ์ฌ์ฉ์๋ฅผ ๊ฒ์ํ๋ ๊ฒ์ ์ด๋ป์ต๋๊น? ์๋๋ฉด ๊ธฐํ์ด ์ง๋ ์ฌ์ฉ์์ ๋๊น?
from Employee
where (occupation = :ocp)
and (salary = :sal)
and (YEAR(join_date) = :jny)
and (tasks.name like '%buy%')
and (tasks.deadline < curdate())
๊ทธ๋ฌํ ์ฟผ๋ฆฌ ์ด๋๊ฐ์ ์ฐ๊ฑฐ๋ null์ด๋ฉด ํ ์ด๋ธ ๊ฐ์ ์กฐ์ธ์ด ์ทจ์๋์ง ์์ต๋๋ค.
๋ฐ๋ผ์ ์ค์ ๋ก ์ฌ๋ฌ ํ ์ด๋ธ์ ํ๋์ ๋ํด ๋ณต์กํ ํํฐ๋ฅผ ์ํํ ๋ Criteria API๊ฐ ๋์์ด ๋ ์ ์์ต๋๋ค. ๊ทธ๋์ ๊ฐ๋ค.
์์ธํ ๋ด์ฉ์ ๊ณต์ ๋ฌธ์ ์์ ํ์ธํ ์ ์์ต๋๋ค .
GO TO FULL VERSION