8.2.2. HQL 공부하기 - where절
가장 간단하게 Where 절을 사용한 HQL은 다음과 같습니다.
s.createQuery("from Member m where m.name = '기선'");
위에서 '기선'과 같은 부분을 파라미터화 하는 방법에는 두 가지가 있습니다.
1. ? 를 사용하는 방법과
2. :를 사용하는 방법이 있습니다.
1. s.createQuery("from Member m where m.name = ? "); 이렇게 파라미터화 할 부분을 ? 로 표시하고 fluent interface 형태로 구현해 놓았기 때문에 뒤에 연달아서 .setParameter(0, "기선"); 을 덧 붙여 주면 됩니다.
2. s.createQuery("from Member m where m.name = :name "); 이렇게 :뒤에 변수 처럼 사용할 이름을 적어주고 .setParameter("name", "기선"); 이렇게 덧붙여 주면 됩니다. 파라미터가 여러개라면 이렇게 이름을 줘서 사용하는 것이 가독성이 좋을 듯 합니다.
이 때 파라미터의 타입을 명확히 주고 싶다면 setString과 같은 메소드를 setParameter대신에 사용하면 됩니다.
3. and 를 사용해서 여러 개의 조건을 줄 수도 있습니다.
이 때 여러 개의 조건을 줄 때 쿼리 결과를 최소한으로 줄여주는 조건문을 앞에 두는 것이 좋습니다.
public void testWhereHQL(){
insertDatas();
q = s.createQuery("select m from k_Member m where name='keesun'");
assertEquals(1, q.list().size());
//1
q = s.createQuery("select m from k_Member m where name = ?")
.setParameter(0, "keesun");
assertEquals(1, q.list().size());
//2
q = s.createQuery("select m from k_Member m where name = :name")
.setParameter("name", "keesun");
assertEquals(1, q.list().size());
//3
q = s.createQuery("select m from k_Member m where name like :name and email like :email")
.setString("name", "%a%")
.setString("email", "%os.net");
assertEquals(2, q.list().size());
}