๊ทธ๋ฃนํ™” ๋ฐ ์ง‘๊ณ„ ๊ธฐ๋Šฅ

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
String hqlQuery = "from Employee where salary < :sal";
Query<Employee> query = session.createQuery(hqlQuery);
query.setParametr("sal", 10000);
List<Employee> results = query.getResultList();
๊ธฐ์ค€ API
CriteriaBuilder builder = session.getCriteriaBuilder();
critQuery.select(critQuery.from(Employee.class)).where(builder.lt(root.get("salary"), 10000));
Query<Employee> query = session.createQuery(critQuery);
List<Employee> results = query.getResultList();

๋‘˜์งธ, ์ฟผ๋ฆฌ๋ฅผ ๋™์ ์œผ๋กœ ๊ตฌ์„ฑํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด ์ž์ฃผ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ง์›, ์•„ํŒŒํŠธ ๋“ฑ์„ ํ•„ํ„ฐ๋งํ•˜๋Š” ์›น ํŽ˜์ด์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ค‘์š”ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋‹จ์ˆœํžˆ ํ‘œ์‹œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋Œ€์‹  ์„œ๋ฒ„์— 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๊ฐ€ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ฐ„๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ ๊ณต์‹ ๋ฌธ์„œ ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค .