Session에 있는 createQuery(Sring) 메소드를 이용해서 HQL을 사용할 수 있습니다.

가장 간단한 HQL은 다음과 같습니다.
s.createQuery(“from Member”);

여기서 ” “사이에 들어간 부분이 HQL로 SQL과는 차이가 있으며 클래스의 이름은 @Entity의 name속성에 지정한 값을 쿼리에서 사용해야 합니다.[footnote]HQL과 @Entity에 있는 name 속성의 관계 참조[/footnote]

select문 사용하기

1. 모든 멤버를 가져오고 싶을 때 select * from Member SQL에서 이렇게 썼는데요. HQL은 이렇게 쓰면 에러가 발생합니다. select m from Member m 처럼 마치 레퍼런스 변수 만들듯이 표현해 주어야 합니다.

2. 특정 변수만 가져오고 싶을 때는 select m.name from Member m 처럼 가져오고 싶은 필드 명을 m이라는 Member의 인스턴스를 통하여 가져오듯이 표현합니다.

3. 여러개의 변수를 읽어 오면(ex select m.name, m.email from Member) 배열의 리스트로 받아 옵니다. 근데 가져온 값을 사용하기가 좀 복잡하네요.

4. SQL 함수인 count, avg, sum, max, min등의 함수도 사용할 수 있습니다.




public void testSelectHQL() {


       insertDatas();


       //1


       q = s.createQuery(“select m from k_Member m”);


       assertEquals(3, q.list().size());


       //2


       q = s.createQuery(“select m.name from k_Member m”);


       List<String> names = q.list();


       assertEquals(3,  names.size());


       assertEquals(“seal”, names.get(0));


       //3


       q = s.createQuery(“select m.name, m.email from k_Member m”);


       List<Object> datas = q.list();


       Object[] line1 = (Object[]) datas.get(0);


       assertEquals(“seal”, (String)line1[0]);


       assertEquals(“seal@os.net”, (String)line1[1]);


       //4


       q = s.createQuery(“select count(*) from k_Member”);


       assertEquals(new Long(3), q.uniqueResult());


}