1.1 HQL ์†Œ๊ฐœ

์ด์ „์— Hibernate์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์•˜์œผ๋ฉฐ ์ด์ œ Hibernate Query Language ๋ผ๊ณ ๋„ ํ•˜๋Š” HQL์„ ์†Œ๊ฐœํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค . ์‚ฌ์‹ค ์ด๊ฒƒ์€ Hibernate์—์„œ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๋ณ€ํ™˜๋œ SQL์ž…๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ์ฐจ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ํ…Œ์ด๋ธ” ์ด๋ฆ„ ๋Œ€์‹  ํด๋ž˜์Šค ์ด๋ฆ„์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค .
  2. ํ…Œ์ด๋ธ” ์—ด ์ด๋ฆ„ ๋Œ€์‹  ํด๋ž˜์Šค ํ•„๋“œ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค .
  3. select์˜ ์„ ํƒ์  ์‚ฌ์šฉ.

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์žˆ๋Š” ๋ชจ๋“  ์‚ฌ์šฉ์ž๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก Hibernate์— ์š”์ฒญํ•ด ๋ด…์‹œ๋‹ค. ํ•ด๋‹น ์š”์ฒญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

from User

๊ทธ๊ฒŒ ์ „๋ถ€์ž…๋‹ˆ๋‹ค. ๋น„๊ต๋ฅผ ์œ„ํ•ด SQL์—์„œ ์œ ์‚ฌํ•œ ์ฟผ๋ฆฌ๋ฅผ ์ œ์‹œํ•ฉ๋‹ˆ๋‹ค.

select * from user

๋‹ค์Œ์€ Userํด๋ž˜์Šค ์ด๋ฆ„์ด๊ณ  ๋Š” userํ…Œ์ด๋ธ” ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.

์™„์ „ํ•œ Java ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.


public List<User> getAllUsers() {
    try (Session session = sessionFactory.openSession()) {
            return session.createQuery("from User", User.class).list();
    }
}

๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด HQL์€ SQL๊ณผ ๋งค์šฐ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์—ฐ์‚ฐ์ž๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

  • WHERE
  • ORDER BY
  • GROUP BY
  • HAVING

1.2 HQL ์ž‘์—… ์˜ˆ์‹œ

์ด์ „ ์˜ˆ์ œ๋Š” ๋™์ผํ•œ ํ…Œ์ด๋ธ” ๋ฐ ํ•„๋“œ ์ด๋ฆ„์œผ๋กœ ์ธํ•ด ์•ฝ๊ฐ„ ํ˜ผ๋ž€์Šค๋Ÿฌ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋” ์‰ฌ์šธ ์ˆ˜ ์žˆ๋Š” ํŠน๋ณ„ํ•œ ์˜ˆ๋ฅผ ์ƒ๊ฐํ•ด ๋ด…์‹œ๋‹ค.

๋‹ค์Œ ํ•„๋“œ๋ฅผ ํฌํ•จํ•˜๋Š” user_data ํ…Œ์ด๋ธ”์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค .

  • ID INT
  • ์‚ฌ์šฉ์ž ์ด๋ฆ„ VARCHAR(100)
  • user_level INT
  • user_created ๋‚ ์งœ

์ด ํ…Œ์ด๋ธ”์— ๋งคํ•‘ํ•  Java ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.


@Entity
@Table(name="user_data")
class User {
   @Id
   @GeneratedValue
   public Integer id;
 
   @Column(name="user_name")
   public String name;
 
   @Column(name="user_level")
   public Integer level;
 
   @Column(name="user_created")
   public Date created;
}

์ด์ œ ๋ช‡ ๊ฐ€์ง€ ์˜ˆ๋ฅผ ์ž‘์„ฑํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

HQL SQL
์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ user_data์—์„œ * ์„ ํƒ
id=3์ธ ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ id=3์ธ user_data์—์„œ *๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
๋ ˆ๋ฒจ์ด (10,20,30)์ธ ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ user_level IN(10, 20, 30)์ธ user_data์—์„œ *๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
์ƒ์„ฑ๋œ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์‚ฌ์šฉ์ž ์ฃผ๋ฌธ์—์„œ user_created asc์˜ user_data ์ฃผ๋ฌธ์—์„œ * ์„ ํƒ
'test'์™€ ๊ฐ™์€ ์ด๋ฆ„์„ ๊ฐ€์ง„ ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ user_data์—์„œ *๋ฅผ ์„ ํƒํ•˜์‹ญ์‹œ์˜ค. ์—ฌ๊ธฐ์„œ user_name์€ 'test'์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

1.3 ์„ ํƒ ์‚ฌ์šฉ

selectHQL์—์„œ๋Š” ๊ฒฐ๊ณผ์˜ ๋ฐ์ดํ„ฐ ์œ ํ˜•์ด ์—์„œ ์ง€์ •ํ•œ ์œ ํ˜•๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š์„ ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค from.

์˜ˆ๋ฅผ ๋“ค์–ด user_data ํ…Œ์ด๋ธ” ์— ์žˆ๋Š” ๋ชจ๋“  ์‚ฌ์šฉ์ž์˜ ์ด๋ฆ„์„ ์–ป์œผ๋ ค๋ฉด ๋‹ค์Œ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

select name from User

๋˜ํ•œ ์ด๋ฆ„์ด ์ค‘๋ณต๋˜๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค DISTINCT.

select distinct name from User

๋ณ„์นญ์€ SQL์—์„œ์™€ ๋™์ผํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

select distinct u.name from User u where u.created > '2020-01-01'

์Œ, ์™„์ „ํžˆ Java ์ฝ”๋“œ์˜ ํ˜•ํƒœ๋กœ ๋œ ์ด ์š”์ฒญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

public List<String> getUserNames() {
    try (Session session = sessionFactory.openSession()) {
            String hql = "select distinct u.name from User u where u.created > '2020-01-01'";
            Query<String> query = session.createQuery(hql , String.class);
            return query.list();
    }
}

์ฟผ๋ฆฌ๋Š” ์ด๋ฆ„ ๋ชฉ๋ก์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฆ„์€ String ์œ ํ˜•์ด๋ฏ€๋กœ ํ•จ์ˆ˜ ์œ ํ˜•๊ณผ Query ํด๋ž˜์Šค์˜ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ชจ๋‘ String ์œ ํ˜•์ž…๋‹ˆ๋‹ค.