1.1 HQL ์๊ฐ
์ด์ ์ Hibernate์ ๋ํด ์์๋ณด์์ผ๋ฉฐ ์ด์ Hibernate Query Language ๋ผ๊ณ ๋ ํ๋ HQL์ ์๊ฐํ๊ฒ ์ต๋๋ค . ์ฌ์ค ์ด๊ฒ์ Hibernate์์ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๊ธฐ ์ํด ๋ณํ๋ SQL์ ๋๋ค. ๋ช ๊ฐ์ง ์ค์ํ ์ฐจ์ด์ ์ด ์์ต๋๋ค.
- ํ ์ด๋ธ ์ด๋ฆ ๋์ ํด๋์ค ์ด๋ฆ์ ์ฌ์ฉํฉ๋๋ค .
- ํ ์ด๋ธ ์ด ์ด๋ฆ ๋์ ํด๋์ค ํ๋ ์ด๋ฆ์ ์ฌ์ฉํฉ๋๋ค .
- 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 ์ ํ ์ฌ์ฉ
select
HQL์์๋ ๊ฒฐ๊ณผ์ ๋ฐ์ดํฐ ์ ํ์ด ์์ ์ง์ ํ ์ ํ๊ณผ ์ผ์นํ์ง ์์ ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค 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 ์ ํ์ ๋๋ค.
GO TO FULL VERSION