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 유형입니다.