ํŽ˜์ด์ง€ ์ž‘์—…: LIMIT ๋ฐ OFFSET

๋งค์šฐ ์ž์ฃผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ฐ์ดํ„ฐ๋Š” "ํŽ˜์ด์ง€"์—์„œ ๊ฒ€์ƒ‰๋ฉ๋‹ˆ๋‹ค. ํฐ ๋ชฉ๋ก์œผ๋กœ ์ž‘์—…ํ•˜๋Š” ๊ฒƒ์ด ํŽธ๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋จผ์ € ํ–‰ 1์—์„œ 20๊นŒ์ง€ ์ฟผ๋ฆฌํ•œ ๋‹ค์Œ 21์—์„œ 40๊นŒ์ง€ ์ฟผ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ SQL์— ์ด LIMIT ๋ฐ OFFSET์— ๋Œ€ํ•œ ํŠน์ˆ˜ ์—ฐ์‚ฐ์ž๊ฐ€ ์žˆ๋Š” ์ผ๋ฐ˜์ ์ธ ์ƒํ™ฉ์ž…๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์—ฐ์‚ฐ์ž์˜ ์•„๋‚ ๋กœ๊ทธ๋Š” Hibernate์—๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ์ฆ‰์‹œ ๋ณ„๋„์˜ ๋ฐฉ๋ฒ•์œผ๋กœ ๋งŒ๋“ค๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • setFirstResult() ๋Š” OFFSET ๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค .
  • setMaxResults() ๋Š” LIMIT ์™€ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค .

์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. 41๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ 20๊ฐœ์˜ ์ž‘์—…์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์š”์ฒญํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

Query<EmployeeTask> query = session.createQuery( โ€œfrom EmployeeTaskโ€, EmployeeTask.class);
query.setFirstResult(41);
query.setMaxResults(20);
List<EmployeeTask> resultLIst = query.list();

๊ฒฐ๊ณผ ์ •๋ ฌ

์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ๋ฌธ์ž์—ด์˜ ์ผ๋ถ€๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ƒˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ์‹œ๊ธ‰ํ•œ ๋ฌธ์ œ๋Š” ์ •๋ ฌ์ž…๋‹ˆ๋‹ค.

Hibernate์—์„œ์˜ ์ •๋ ฌ์€ HQL ์ฟผ๋ฆฌ์— ์ง์ ‘ ์ž‘์„ฑ๋˜๋ฉฐ ์ผ๋ฐ˜์ ์œผ๋กœ ์˜ˆ์ƒ๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

from Employee order by joinDate

์ •๋ ฌ ์ˆœ์„œ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด ์ต์ˆ™ํ•œ ๋‹จ์–ด์ธ asc ๋ฐ desc๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ:

from Employee order by joinDate desc

SQL์—์„œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์—ฌ๋Ÿฌ ํ•„๋“œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

from Employee order by joinDate desc, name asc

๋˜ํ•œ ์ •๋ ฌ ํ•„๋“œ๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

String hql = "from EmployeeTask where employee.name = :username order by :ord";
Query<EmployeeTask> query = session.createQuery( hql, EmployeeTask.class);
query.setParameter(โ€œusernameโ€, โ€œIvan Ivanovichโ€);
query.setParameter(โ€œordโ€, โ€œnameโ€);

List<EmployeeTask> resultLIst = query.list();

HQL์˜ ๊ธฐ๋Šฅ

HQL์˜ SQL๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ HQL์ด ์ง€์›ํ•˜๋Š” ์ง‘๊ณ„ ํ•จ์ˆ˜ ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค .

์ง‘๊ณ„ ํ•จ์ˆ˜ ์„ค๋ช…
์„ธ๋‹ค() ํ–‰ ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
ํ•ฉ์ง‘ํ•ฉ() ๊ฐ’์˜ ํ•ฉ๊ณ„๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.
๋ถ„() ์ตœ์†Œ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
์ตœ๋Œ€() ์ตœ๋Œ€๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
ํ‰๊ท () ํ‰๊ท ์„ ๋ฐ˜ํ™˜

์ž˜ ๊ธฐ์–ตํ•˜๊ณ  ์žˆ๋“ฏ์ด ์ง‘๊ณ„ ํ•จ์ˆ˜๋Š” group by์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. Group By๋Š” SQL์—์„œ์™€ ์ •ํ™•ํžˆ ๋™์ผํ•˜๊ฒŒ ์ž‘๋™ํ•˜๋ฏ€๋กœ ๋ฐ˜๋ณตํ•˜์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋ฌผ๋ก  ์ผ๋ฐ˜์ ์ธ ๊ธฐ๋Šฅ . ์ผ๋ฐ˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ํ›จ์”ฌ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. SQL ์„œ๋ฒ„์—์„œ ์ˆ˜ํ–‰๋˜๋ฉฐ Hibernate๋Š” ์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฟผ๋ฆฌ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ƒ์„ฑํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ Hibernate๋Š” SQL Server๊ฐ€ ์ง€์›ํ•˜๋Š” ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  SQL ์„œ๋ฒ„์˜ ์œ ํ˜•์€ SessionFactory๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ sqlDialect ๋งค๊ฐœ๋ณ€์ˆ˜์— ์˜ํ•ด ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž์—๊ฒŒ ํ• ๋‹น๋œ ์ž‘์—…์˜ ์ˆ˜๋ฅผ ์ฐพ์•„๋ด…์‹œ๋‹ค.

String hql = "select count(*) from EmployeeTask where employee.name = :username ";
Query<Integer> query = session.createQuery( hql, Integer.class);
query.setParameter(โ€œusernameโ€, โ€œIvan Ivanovichโ€);
Integer count = query.uniqueResult();