2011-04-18 3 views
3

Hibernate Criteria API에서 JPA2 Criteria API로 업그레이드 중이며 해결할 수없는 다음 문제가 발생합니다.JPA2 Criteria API를 사용하여 문자열 하위 집합에 대한 쿼리

criteria.add(Restrictions.sqlRestriction("{alias}.location_key = left((?), length({alias}.location_key))", searchObj.getLocationKey(), Hibernate.STRING)); 

이 본질적으로 상기 입력 문자열의 첫 N 문자 N 문자 인 location_key 일치하는지 체크한다 : 현 서브 세트의 특정 종류를 확인하기 위해 난 Restrictions.sqlRestriction를 사용 하였다 절전 조건에서

긴. 입력 문자열 Canada,ONCanada 또는 Can 또는 C과 같이 일치해야합니다.

문제는 JPA2가 네이티브 SQL을 코딩 할 수 없으며, left 함수가 없으면 어떻게 비슷한 결과를 얻을 수 있는지 확신 할 수 없다는 것입니다.

도움을 주시면 감사하겠습니다.

답변

1

정확히 어떻게 쿼리가 작동하는지 모르겠지만 LEFT() 대신 CriteriaBuilder.substring (Expression, int)을 사용할 수 없어야합니까? 생성하고자하는 실제 SQL을 제공하면 더 좋은 아이디어를 얻을 수 있습니다.

+0

대략 생성하려는 SQL을 포함 시켰습니다. 'select ... where location_key = left (("asdfasdf"), length (location_key));는 쿼리의보다 정확한 버전입니다. 문자열이 아닌 표현식 을 기대하기 때문에 하위 문자열은 나에게 많은 도움이되지 않습니다. – idbentley

+0

'CriteriaBuilder.literal (T)'는 '표현식 '을 생성합니다. 그래서 기본적으로 :'criteriaQuery.where (cb.equals (cb.substring (cb.literal (string), 0, location_key.length()), location_key));는 트릭을해야합니다. –

+0

고맙습니다. 어제 매개 변수를 사용하여 실제로이 작업을 처리했습니다. 그러나 리터럴이 현명하다고 생각합니다. – idbentley

관련 문제