2.1 ์ฟผ๋ฆฌ ํด๋ž˜์Šค ์†Œ๊ฐœ

๊ทธ๋Ÿฐ๋ฐ ๋˜ ๋‹ค๋ฅธ ์ค‘์š”ํ•œ ์ ์€ ์ฟผ๋ฆฌ ๋„์šฐ๋ฏธ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. ์ด ์˜ˆ์—์„œ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

public List<Employee> getAllEmployes() {
    try (Session session = sessionFactory.openSession()) {
            Query<Employee> query = session.createQuery("from Employee", Employee.class);
            return query.list();
    }
}

์‹ค์ œ๋กœ Query๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ด๋ฉฐ ๋‹ค์–‘ํ•œ ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ์—ฌ๋Ÿฌ ๊ตฌํ˜„์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ๊ณ„์†ํ•ด์„œ ํด๋ž˜์Šค๋ผ๊ณ  ๋ถ€๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ OOP ์ธก๋ฉด์—์„œ ๋„“์€ ์˜๋ฏธ์˜ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.

๋ฉ”๋ชจ. ์ด์ „์—๋Š” ๋‘ ๊ฐœ์˜ ํด๋ž˜์Šค๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

  • ์ฟผ๋ฆฌ๋ฅผ ์„ค๋ช…ํ•˜๋Š” ์ฟผ๋ฆฌ์ž…๋‹ˆ๋‹ค .
  • ์•Œ๋ ค์ง„ ์œ ํ˜•์˜ ์ฟผ๋ฆฌ๋ฅผ ์„ค๋ช…ํ•˜๋Š” TypedQuery .

์ฒซ ๋ฒˆ์งธ๋Š” Hibernate๊ฐ€ ์ด๋ฏธ ์กด์žฌํ•˜๊ณ  ์ œ๋„ค๋ฆญ์ด ์•„์ง ์—†์„ ๋•Œ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ JDK 5 ๋ฆด๋ฆฌ์Šค ์ดํ›„ Hibernate - TypedQuery์— ์ด๋ฏธ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์˜ ํƒ€์ดํ•‘์„ ์ง€์›ํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ํด๋ž˜์Šค๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋‚ด๊ฐ€ ๊ธฐ์–ตํ•˜๋Š” ํ•œ, Hibernate 5๋ฒˆ์งธ ๋ฒ„์ „๋ถ€ํ„ฐ Typed ํด๋ž˜์Šค๊ฐ€ ํ•˜๋‚˜๋งŒ ๋‚จ์•˜๊ณ  ์ด์ œ Query๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์ฟผ๋ฆฌ๋ฅผ ๋งŒ๋“œ๋Š” ํ‘œ์ค€ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.


Query<Employee> query = session.createQuery("from Employee", Employee.class);

์ฟผ๋ฆฌ ๊ฐœ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์› ์ง€๋งŒ ์ด๋Ÿฌํ•œ ์ฟผ๋ฆฌ๋ฅผ ์–ด๋–ป๊ฒŒ ์‹คํ–‰ํ•ฉ๋‹ˆ๊นŒ?

์—ฌ๊ธฐ์„œ๋Š” ํ›จ์”ฌ ๋” ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. Query ๊ฐœ์ฒด์—์„œ list() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.


Query<Employee> query = session.createQuery("from Employee", Employee.class);
List<Employee> resultLั–st = query.list();

list() ๋ฉ”์„œ๋“œ์—๋Š” ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€๋งŒ getResultList() ๋ผ๊ณ  ํ•˜๋Š” ๋ฉ”์„œ๋“œ์ธ JPA ๋™์˜์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค . ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ์—์„œ ๊ฐ€๋” ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์ฟผ๋ฆฌ๊ฐ€ ๊ฒฐ๊ณผ๊ฐ€ ๋‹จ์ผ ๊ฒฐ๊ณผ์— ์žˆ์Œ์„ ์•”์‹œํ•˜๋Š” ๊ฒฝ์šฐ uniqueResult() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฟผ๋ฆฌ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค .


Query<Employee> query = session.createQuery("from Employee where id = 1", Employee.class);
Employee result = query.uniqueResult();

uniqueResult() ๋ฉ”์„œ๋“œ์—๋Š” JPA ๋™์˜์–ด์ธ singleResult() ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค . JPA ํ‘œ์ค€๊ณผ Hibernate์˜ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด ๋„์ž…๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Š” ๋˜‘๊ฐ™์€ ์ผ์„ ํ•ฉ๋‹ˆ๋‹ค.

2.2 ์ฟผ๋ฆฌ ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ

์‹ค์ œ๋กœ Query ํด๋ž˜์Šค์—๋Š” ๋‹ค์–‘ํ•œ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜์—์„œ ๋‚˜๋Š” ๊ทธ๋“ค ์ค‘ ์„ธ ๊ฐ€์ง€์— ๋Œ€ํ•ด ๋” ์ด์•ผ๊ธฐ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ฒซ ๋ฒˆ์งธ๋Š” stream() ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค . ๊ทธ๋ฆฌ๊ณ  JPA ๋™์˜์–ด getResultStream() ์ž…๋‹ˆ๋‹ค .

์ด ๋‘ ๋ฉ”์„œ๋“œ๋Š” ๋ชจ๋‘ ๋ชฉ๋ก ๋Œ€์‹  ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋กœ ์–ป์€ ๋ชจ๋“  ๊ฐœ์ฒด๊ฐ€ ํ•œ ๋ฒˆ์— ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋งค์šฐ ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” ๊ทธ๋“ค ์ค‘ ์ฒซ ๋ฒˆ์งธ๋งŒ ์‚ฌ์šฉ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ:


Query<Employee> query = session.createQuery("from Employee where id > 100", Employee.class);
Stream<Employee> stream = query.stream();

๋‘ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์€ executeUpdate() ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค . ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋ฌด์–ธ๊ฐ€๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ Hibernate๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผํ•  ๋•Œ ์ฝ๊ธฐ ์ „์šฉ ํŠธ๋žœ์žญ์…˜์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

์š”์ฒญ ์˜ˆ: ๋ชจ๋“  ์‚ฌ์šฉ์ž์˜ ๋ ˆ๋ฒจ์„ 1 ์˜ฌ๋ฆฌ๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค.


Query<User> query = session.createQuery("update User set level=level+1", User.class);
int count = query.executeUpdate();

executeUpdate() ๋ฉ”์„œ๋“œ๋Š” ์‹ค์ œ๋กœ ์ˆ˜์ •๋œ ํ–‰ ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ์„ธ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์€ scroll() ์ž…๋‹ˆ๋‹ค . ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์กฐ๊ธˆ ๋” ์•Œ๋ ค ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

2.3 ์Šคํฌ๋กค ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ

์ด ๋ฉ”์„œ๋“œ๋Š” stream() ๋ฉ”์„œ๋“œ ์™€ ๋‹ค์†Œ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค . ๊ฒฐ๊ณผ๋ฅผ ์ „ํ˜€ ๊บผ๋‚ด์ง€ ์•Š๊ณ  ๊ฒฐ๊ณผ ๋ชฉ๋ก์„ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•œ ๋‹ค์Œ ๊ฒฐ๊ณผ์˜ ๋ฐฑ๋งŒ ๋ฒˆ์งธ ์ค„๋กœ ์Šคํฌ๋กคํ•˜๊ณ  ๊ฑฐ๊ธฐ์—์„œ ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ๋ฅผ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๊ณ ๊ธ‰ ๋ฐ˜๋ณต์ž์ž…๋‹ˆ๋‹ค.


Query<Employee> query = session.createQuery("from Employee where id > 100", Employee.class);
ScrollableResults<Employee> scroll = query.scroll();

ScrollableResults ๊ฐœ์ฒด์—๋Š” ๋‹ค์Œ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐฉ๋ฒ• ์„ค๋ช…
์•„๋ฅด๋ฐ”์ดํŠธ() ํ˜„์žฌ ์š”์†Œ๋ฅผ ๋ฐ˜ํ™˜
๋‹ค์Œ() ํฌ์ธํ„ฐ๋ฅผ ๋‹ค์Œ ์š”์†Œ๋กœ ์ด๋™
์ด์ „์˜() ํฌ์ธํ„ฐ๋ฅผ ์ด์ „ ์š”์†Œ ๋กœ ์ด๋™
์Šคํฌ๋กค(์ •์ˆ˜ ํฌ๊ธฐ) ํฌ๊ธฐ ์„ ์„ ๊ธฐ์ค€์œผ๋กœ ์•ž์œผ๋กœ ์Šคํฌ๋กค
์œ„์น˜(์ •์ˆ˜ ์œ„์น˜) ์š”์†Œ ์œ„์น˜ ๋ฒˆํ˜ธ๋ฅผ ํ˜„์žฌ ์š”์†Œ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
๋งˆ์ง€๋ง‰() ํ˜„์žฌ ์š”์†Œ๋Š” ์ด์ œ ๋งˆ์ง€๋ง‰ ์š”์†Œ ์ž…๋‹ˆ๋‹ค.
์ฒซ ๋ฒˆ์งธ() ํ˜„์žฌ ์š”์†Œ๋Š” ์ด์ œ ์ฒซ ๋ฒˆ์งธ ์š”์†Œ ์ž…๋‹ˆ๋‹ค.
getRowNumber() ํ˜„์žฌ ์ค„ ๋ฒˆํ˜ธ๋ฅผ ๋ฐ˜ํ™˜
setRowNumber() ํ˜„์žฌ ์ค„ ๋ฒˆํ˜ธ ์„ค์ •

์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ–ˆ๊ณ  ๋งˆ์ง€๋ง‰ ์š”์†Œ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ์‹ถ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.


Query<Employee> query = session.createQuery("from Employee where id > 100", Employee.class);
ScrollableResults<Employee> scroll = query.scroll();
scroll.last();
Employee lastEmployee = scroll.get();