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