html
HQL ์๋ จ: Hibernate Query Language์ ๋ํ ์ข ํฉ ๊ฐ์ด๋
๋ชฉ์ฐจ
- ์๊ฐ
- HQL ์ดํดํ๊ธฐ
- HQL ์ค์ ํ๊ธฐ
- ๊ธฐ๋ณธ HQL ์ฟผ๋ฆฌ ์คํํ๊ธฐ
- ๊ณ ๊ธ HQL ์ด์
- ํธ๋์ญ์ ๊ด๋ฆฌํ๊ธฐ
- ์ผ๋ฐ์ ์ธ ์ค๋ฅ ๋ฐ ๋ฌธ์ ํด๊ฒฐ
- ๊ฒฐ๋ก
์๊ฐ
Mastering HQL: A Comprehensive Guide to Hibernate Query Language์ ์ค์ ๊ฒ์ ํ์ํฉ๋๋ค. Hibernate ์ธ๊ณ์ ์ฒซ ๋ฐ์ ๋ด๋๋ ์ด๋ณด์๋ , ๊ธฐ๋ณธ ์ง์์ ๊ฐ์ง๊ณ ์ดํด๋ฅผ ์ฌํํ๋ ค๋ ๊ฐ๋ฐ์๋ , ์ด ์ ์์ฑ ์ ์ฌ๋ฌ๋ถ์ ์ํด ๋ง์ถค ์ ์๋์์ต๋๋ค.
Hibernate Query Language (HQL)๋ Java ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ํธ ์์ฉ์ ๋จ์ํํ๋ ๊ฐ๋ ฅํ ๋๊ตฌ์ ๋๋ค. HQL์ ํ์ฉํ๋ฉด ๊ฐ๋ฐ์๋ ๋ณต์กํ ์ฟผ๋ฆฌ๋ฅผ ์ฝ๊ฒ ์ํํ ์ ์์ด ์์ฐ์ฑ์ ๋์ด๊ณ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ๊น๋ํ๊ฒ ์ ์งํ ์ ์์ต๋๋ค.
HQL์ด ์ค์ํ ์ด์
HQL์ Hibernate์ ORM ๊ธฐ๋ฅ์ ํต์ฌ์ ์๋ฆฌ์ก๊ณ ์์ด ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ๊ณผ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ์ ๊ฐ๊ทน์ ๋ฉ์์ค๋๋ค. SQL์ ๋ณต์ก์ฑ์ ์ถ์ํํ๋ ๋ฅ๋ ฅ์ ํจ์จ์ ์ธ ๋ฐ์ดํฐ ๊ด๋ฆฌ์ ํ์์ ์ ๋๋ค.
์ฅ๋จ์
์ฅ์ | ๋จ์ |
---|---|
๋ณต์กํ SQL ์ฟผ๋ฆฌ๋ฅผ ๋จ์ํ | ์ด๋ณด์์๊ฒ๋ ํ์ต ๊ณก์ ์ด ์์ |
์ฝ๋ ๊ฐ๋ ์ฑ๊ณผ ์ ์ง ๋ณด์์ฑ ํฅ์ | ์์ SQL ์ต์ ํ์ ๋ํ ์ ์ด๋ ฅ ๊ฐ์ |
Hibernate ํ๋ ์์ํฌ์ ์ํํ๊ฒ ํตํฉ | ์ฟผ๋ฆฌ ์คํ์ ์ํ Hibernate ์์กด์ฑ |
๊ฐ์ฒด ์งํฅ ๊ธฐ๋ฅ ์ง์ | ์ผ๋ถ ๊ฒฝ์ฐ ์ฑ๋ฅ ์ค๋ฒํค๋ ๊ฐ๋ฅ์ฑ |
HQL์ ์ธ์ ์ฌ์ฉํด์ผ ํ๋๊ฐ
HQL์ ๊ฐ์ฒด ์งํฅ ์ฟผ๋ฆฌ์ ์ด์ ์ ํ์ฉํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ ์ ์ํํด์ผ ํ ๋ ์ด์์ ์ ๋๋ค. ํนํ ๊นจ๋ํ๊ณ ์ ์ง ๊ด๋ฆฌํ๊ธฐ ์ฌ์ด ์ฝ๋๋ฅผ ์ ์งํ๋ ๊ฒ์ด ์ฐ์ ์์์ธ ์ํฉ์์ ํนํ ์ ์ฉํฉ๋๋ค.
HQL ์ดํดํ๊ธฐ
HQL์ด๋?
Hibernate Query Language (HQL)๋ SQL๊ณผ ์ ์ฌํ์ง๋ง Hibernate์ ORM ํ๋ ์์ํฌ์ ๋ง๊ฒ ์กฐ์ ๋ ๊ฐ๋ ฅํ ๊ฐ์ฒด ์งํฅ ์ฟผ๋ฆฌ ์ธ์ด์ ๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ์ ์ง์ ์๋ํ๋ SQL๊ณผ ๋ฌ๋ฆฌ, HQL์ Hibernate์ ์ํฐํฐ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ๋ณด๋ค ์ง๊ด์ ์ด๊ณ ์ ์ง ๊ด๋ฆฌํ๊ธฐ ์ฌ์ด ์ฟผ๋ฆฌ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
Hibernate์์์ HQL์ ์ค์์ฑ
HQL์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ์ฒด ๋ชจ๋ธ๊ณผ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ์ ๋ค๋ฆฌ๋ฅผ ์ ๊ณตํจ์ผ๋ก์จ Hibernate์์ ์ค์ํ ์ญํ ์ ํฉ๋๋ค. SQL์ ๋ณต์ก์ฑ์ ์ถ์ํํ์ฌ ๊ฐ๋ฐ์๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ํธ ์์ฉ์ ๋ณต์ก์ฑ๋ณด๋ค ๋น์ฆ๋์ค ๋ก์ง์ ์ง์คํ ์ ์๊ฒ ํฉ๋๋ค.
HQL ์ฌ์ฉ์ ์ฅ๋จ์
์ฅ์
- ๊ฐ์ฒด ์งํฅ: ์ฟผ๋ฆฌ๊ฐ ๊ฐ์ฒด๋ฅผ ๊ธฐ์ค์ผ๋ก ์์ฑ๋์ด ๋ณด๋ค ์ง๊ด์ ์ ๋๋ค.
- ์ ์ง ๋ณด์์ฑ: ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง ๋ณ๊ฒฝ ์ HQL ์ฟผ๋ฆฌ์ ์์ ์ด ๋ ์ ๊ฒ ํ์ํฉ๋๋ค.
- ํตํฉ: Hibernate์ ์ธ์ ๊ด๋ฆฌ ๋ฐ ํธ๋์ญ์ ์ฒ๋ฆฌ์ ์ํํ๊ฒ ํตํฉ๋ฉ๋๋ค.
๋จ์
- ์ฑ๋ฅ ์ค๋ฒํค๋: ์ผ๋ถ ๊ฒฝ์ฐ, HQL์ ์์ SQL์ ๋นํด ์ฑ๋ฅ ์ ํ๋ฅผ ์ด๋ํ ์ ์์ต๋๋ค.
- ํ์ต ๊ณก์ : HQL์ ๋ฏธ๋ฌํ ์ฐจ์ด๋ฅผ ์ดํดํ๋ ค๋ฉด ์ด๊ธฐ ๋ ธ๋ ฅ์ด ํ์ํฉ๋๋ค.
HQL ์ค์ ํ๊ธฐ
Hibernate ์ค์ ํ๊ธฐ
HQL์ ๋ฐ์ด๋ค๊ธฐ ์ ์, Hibernate๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ค์ ํ๋ ๊ฒ์ด ํ์์ ์ ๋๋ค. ์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ์ธ๋ถ ์ ๋ณด์ Hibernate ์ค์ ์ ํฌํจํ๋ hibernate.cfg.xml ํ์ผ์ ๊ตฌ์ฑํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<!-- hibernate.cfg.xml --> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- Database connection settings --> <property name="connection.driver_class">com.mysql.cj.jdbc.Driver</property> <property name="connection.url">jdbc:mysql://localhost:3306/yourdb</property> <property name="connection.username">root</property> <property name="connection.password">password</property> <!-- SQL dialect --> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <!-- Echo all executed SQL to stdout --> <property name="show_sql">true</property> <!-- Mapping class --> <mapping class="org.studyeasy.entity.Users"/> </session-factory> </hibernate-configuration> |
์ํฐํฐ ํด๋์ค ์ ์ํ๊ธฐ
์ํฐํฐ ํด๋์ค๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ ์ด๋ธ์ ๋ํ๋ ๋๋ค. ์๋ฅผ ๋ค์ด, Users ์ํฐํฐ๋ ๋ค์๊ณผ ๊ฐ์ ์ ์์ต๋๋ค.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
// Users.java package org.studyeasy.entity; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; @Entity @Table(name = "users") public class Users { @Id private int id; private String name; private String email; // Getters and Setters } |
๊ธฐ๋ณธ HQL ์ฟผ๋ฆฌ ์คํํ๊ธฐ
์ธ์ ์์ฑํ๊ธฐ
HQL์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํธ ์์ฉํ๋ ค๋ฉด ๋จผ์ Hibernate ์ธ์ ์ ์์ฑํด์ผ ํฉ๋๋ค. ์ด ์ธ์ ์ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ์ ์ฐ๊ฒฐ์ ๊ด๋ฆฌํฉ๋๋ค.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
// App.java package org.studyeasy; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class App { public static void main(String[] args) { SessionFactory factory = new Configuration() .configure("hibernate.cfg.xml") .addAnnotatedClass(Users.class) .buildSessionFactory(); Session session = factory.getCurrentSession(); try { // Your HQL operations go here } finally { factory.close(); } } } |
๊ฐ๋จํ ์ฟผ๋ฆฌ ์์ฑํ๊ธฐ
HQL์ SQL๊ณผ ์ ์ฌํ์ง๋ง ์ํฐํฐ ๊ฐ์ฒด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ ์ ์๊ฒ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ชจ๋ ์ฌ์ฉ์๋ฅผ ๋์ดํ๋ ค๋ฉด:
1 2 |
List<Users> users = session.createQuery("from Users").getResultList(); |
getResultList๋ก ๊ฒฐ๊ณผ ์ฒ๋ฆฌํ๊ธฐ
Hibernate ๋ฒ์ 5.2 ์ด์์์๋ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด ์ด์ ์ list() ๋ฉ์๋๋ณด๋ค getResultList ๋ฉ์๋๊ฐ ์ ํธ๋ฉ๋๋ค.
1 2 3 4 5 |
List<Users> users = session.createQuery("from Users").getResultList(); for (Users user : users) { System.out.println(user); } |
๊ณ ๊ธ HQL ์ด์
HQL์์ Criteria ์ฌ์ฉํ๊ธฐ
Criteria๋ ๋์ ์ฟผ๋ฆฌ๋ฅผ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ์ ์ํ ์ ์๊ฒ ํ์ฌ, ์ ์ HQL ๋ฌธ์์ด์ ๋นํด ๋ ๋ง์ ์ ์ฐ์ฑ์ ์ ๊ณตํฉ๋๋ค.
1 2 3 4 5 6 |
CriteriaBuilder cb = session.getCriteriaBuilder(); CriteriaQuery<Users> cq = cb.createQuery(Users.class); Root<Users> root = cq.from(Users.class); cq.select(root).where(cb.equal(root.get("name"), "John Doe")); List<Users> users = session.createQuery(cq).getResultList(); |
HQL์ Spring๊ณผ ํตํฉํ๊ธฐ
HQL์ Spring ํ๋ ์์ํฌ์ ํตํฉํ๋ฉด ํธ๋์ญ์ ๊ด๋ฆฌ ๋ฐ ์์กด์ฑ ์ฃผ์ ์ด ํฅ์๋์ด ์ ํ๋ฆฌ์ผ์ด์ ์ํคํ ์ฒ๋ฅผ ๊ฐ์ํํ ์ ์์ต๋๋ค.
1 2 3 4 5 6 7 8 9 10 11 12 |
@Service public class UserService { @Autowired private SessionFactory sessionFactory; public List<Users> getAllUsers() { Session session = sessionFactory.getCurrentSession(); return session.createQuery("from Users").getResultList(); } } |
ํธ๋์ญ์ ๊ด๋ฆฌํ๊ธฐ
ํธ๋์ญ์ ์์๊ณผ ์ปค๋ฐ
์ ์ ํ ํธ๋์ญ์ ๊ด๋ฆฌ๋ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ๊ณผ ์ผ๊ด์ฑ์ ๋ณด์ฅํฉ๋๋ค.
1 2 3 4 5 6 7 8 |
Session session = factory.getCurrentSession(); session.beginTransaction(); List<Users> users = session.createQuery("from Users").getResultList(); // Commit the transaction session.getTransaction().commit(); |
ํธ๋์ญ์ ๊ฒฝ๊ณ ์ฒ๋ฆฌํ๊ธฐ
"Local variable is not used"๊ณผ ๊ฐ์ ๊ฒฝ๊ณ ๋ ๋ณ์๊ฐ ์ ์ธ๋์์ง๋ง ์ฌ์ฉ๋์ง ์์์ ๋ ๋ฐ์ํ ์ ์์ต๋๋ค. ์ฝ๋์ ๋ช ํ์ฑ๊ณผ ํจ์จ์ฑ์ ์ ์งํ๊ธฐ ์ํด ๋ชจ๋ ๋ณ์๊ฐ ๋ชฉ์ ์ ์ํํ๋๋ก ํด์ผ ํฉ๋๋ค.
์ผ๋ฐ์ ์ธ ์ค๋ฅ ๋ฐ ๋ฌธ์ ํด๊ฒฐ
์ํฐํฐ ์ด๋ฆ ์ดํดํ๊ธฐ
"from users"์ ๊ฐ์ด "from Users" ๋์ ์ฌ์ฉํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋น์ ์์ ์ผ๋ก ์ข ๋ฃ๋ ์ ์์ต๋๋ค. HQL ์ฟผ๋ฆฌ๊ฐ ์ํฐํฐ ํด๋์ค์์ ์ ์๋ ์ฌ๋ฐ๋ฅธ ์ํฐํฐ ์ด๋ฆ์ ์ฌ์ฉํ๋์ง ํ์ธํ์ธ์.
1 2 3 4 5 6 |
// Correct List<Users> users = session.createQuery("from Users").getResultList(); // Incorrect List<Users> users = session.createQuery("from users").getResultList(); |
List ๋ณํ ๊ฒฝ๊ณ ํด๊ฒฐํ๊ธฐ
List์ ํ์ ์ ๋ช ์ํ์ง ์์ผ๋ฉด ์ฒดํฌ๋์ง ์์ ๊ฒฝ๊ณ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
1 2 3 4 5 6 |
// Warning: List is unchecked List users = session.createQuery("from Users").getResultList(); // Recommended: Use generic types List<Users> users = session.createQuery("from Users", Users.class).getResultList(); |
๊ฒฐ๋ก
์ด ๊ฐ์ด๋์์๋ Hibernate Query Language (HQL)์ ๊ธฐ๋ณธ ๊ฐ๋ , ๊ณ ๊ธ ์ด์ ๋ฐ ์ค์ฉ์ ์ธ ๊ตฌํ์ ๊น์ด ํ๊ตฌํ์ต๋๋ค. Hibernate ์ค์ ๋ถํฐ ๋ณต์กํ ์ฟผ๋ฆฌ ์คํ๊น์ง, HQL์ ์๋ฌํจ์ผ๋ก์จ ๊ฐ๋ ฅํ๊ณ ํจ์จ์ ์ธ Java ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
์ฃผ์ ๋ด์ฉ
- HQL์ ๊ฐ์ฒด ์งํฅ์ ๋๋ค: ์ํฐํฐ ๊ฐ์ฒด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์๋ํ์ฌ ์ง๊ด์ ์ธ ์ฟผ๋ฆฌ ์์ฑ์ ์ฉ์ดํ๊ฒ ํฉ๋๋ค.
- getResultList๊ฐ ์ ํธ๋ฉ๋๋ค: Hibernate 5.2 ์ด์์์ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด getResultList๋ฅผ ์ฌ์ฉํ์ธ์.
- ์ ์ ํ ํธ๋์ญ์ ๊ด๋ฆฌ: ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ๊ณผ ์ผ๊ด์ฑ์ ๋ณด์ฅํฉ๋๋ค.
- ์ธ๋ถ ์ฌํญ์ ์ฃผ์: ์ฌ๋ฐ๋ฅธ ์ํฐํฐ ์ด๋ฆ ์ง์ ๊ณผ ์ผ๋ฐ ํ์ ์ฒ๋ฆฌ๋ก ์ผ๋ฐ์ ์ธ ์ค๋ฅ๋ฅผ ๋ฐฉ์งํฉ๋๋ค.
HQL์ ํ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ํธ ์์ฉ์ ๊ฐ์ํํ๊ณ Hibernate ์๋ จ๋๋ฅผ ํฅ์์ํค์ธ์.
์ฐธ๊ณ : ์ด ๊ธฐ์ฌ๋ AI์ ์ํด ์์ฑ๋์์ต๋๋ค.