CodeGym /행동 /All lectures for KO purposes /HQL에서 쿼리를 작성하는 방법 배우기

HQL에서 쿼리를 작성하는 방법 배우기

All lectures for KO purposes
레벨 1, 레슨 829
사용 가능

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

코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION