2012-10-23 2 views
0

HQL을 사용하여 동적 쿼리를 만들고 있지만, 많은 매개 변수 때문에 Criteria가 훨씬 더 "읽기 쉽습니다"라고 생각합니다. 쿼리는 다음과 같이 표시됩니다.관련 조인을 반환하는 HQL, 기준에서이를 수행하는 방법?

String queryString = "select u from ReportSalesUnit as r join r.recipients as u where r.id = :reportSalesUnitId"; 
if (firstName != null) 
{ 
    queryString += " and lower(u.firstName) like :firstName"; 
} 
if (lastName != null) 
{ 
    queryString += " and lower(u.lastName) like :lastName"; 
} 
if (email != null) 
{ 
    queryString += " and lower(u.email) like :email"; 
} 
if (phoneNr != null) 
{ 
    queryString += " and u.phoneNr like :phoneNr"; 
} 
Query query = session.createQuery(queryString); 
if (firstName != null) 
{ 
    query.setParameter("firstName", firstName.toLowerCase() + "%"); 
} 
if (lastName != null) 
{ 
    query.setParameter("lastName", lastName.toLowerCase() + "%"); 
} 
if (email != null) 
{ 
    query.setParameter("email", email.toLowerCase() + "%"); 
} 
if (phoneNr != null) 
{ 
    query.setParameter("phoneNr", phoneNr + "%"); 
} 
query.setParameter("reportSalesUnitId", reportSalesUnitId); 

솔직히 말해서 관련 조인을 기준으로 반환하는 방법을 모릅니다. 여기에 대한 답변을 찾고 있었지만 찾을 수 없습니다 : http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/querycriteria.html, 누군가가 나를 도울 수 있습니까? 약간의 설명이 좋을 것입니다.

답변

0

기준이처럼 사용할 수 있습니다 :

보인다으로
... 
if(firstName != null) { 
    criteria.add(Restrictions.and(
     Restrictions.isNotNull("firstName"), Restrictions.eq("firstName", firstName.toLowerCase()); 
... 

, 훨씬 더 읽을 수 많은 조건부로받지 않습니다. 그러나 Criteria이 방법으로 당신을 도울 수 있습니다 : 당신은 Criteria/Query 창조에 도달하기 전에 널 (또는 다른 특별 항목)을 사전에 확인해야합니다

. 결국 당신은 다음과 같은 코드가하고 나는 당신을 위해 허용 같아요

... 
criteria.add(Restrictions.eq("firstName", firstName.toLowerCase())); 
criteria.add(Restrictions.eq("phoneNr", phoneNr)); 
... 
criteria.list(); 

그리고, 만들 수있는 조인이 같은 별칭을 통해 데이터를 가져 오기 :

criteria.createAlias("recipients", "recipients", JoinType.LEFT_OUTER_JOIN); 

또는

criteria.createAlias("recipients", "recipients"); 
     .setFetchMode("recipients", FetchMode.JOIN); 

according to your needs. 
+0

사실 내가 요구 한 것이 아닙니다. 내 select는 다음과 같이 보입니다 :'ReportSalesUnit에서 r을 r.recipients as join '으로 선택하십시오. 그리고 HQL이있는'ReportSalesUnit as r' 대신에''r.recipients''와 같은 조인 ('r.recipients')을 반환하는 방법이 궁금합니다. – kamil

+0

을 위해 생성되었습니다. Ok, 나는 그것을 얻었고 대답을 편집했습니다. – faradaj

+0

내가 말한 것처럼 criteria.createCriteria (ReportSalesUnit.class)는 위에서 언급 한 asso ~ join을 반환하기 위해'criteria.createAlias ​​("recipients", "recipients")를 추가해야한다. .setFetchMode ("받는 사람", FetchMode.JOIN); 및 단순히'criteria.list()'? 아니면 다른 방법으로 – kamil

관련 문제