2011-04-28 4 views
0

나는 이름 필드를 기반으로 테이블을 검색하는 데 사용하는 DetachedCriteria을 가지고 있습니다. 검색에서 대소 문자를 구별하지 않으려 고합니다. HQL을 사용하지 않고이 작업을 수행 할 수있는 방법이 있는지 궁금합니다.집계 함수 호출을 위해 Hibernate DetachedCriteria 사용

private void searchByFullName(DetachedCriteria criteria, String searchCriteria) { 
     criteria.add(Restrictions.like("fullName", "%" + searchCriteria.toLowerCase() + "%")); 
     criteria.addOrder(Order.asc("fullName")); 
} 

그러나 나는 그것이 검색 (는 대문자와 소문자를 모두 검색 할 수있다) 그렇게되면이 사건을 무시 있는지 확인하려면, 그래서 생성하는 SQL처럼 보일 것이다 : 뭔가 같은 :

SELECT * FROM Student WHERE ? LIKE toLower(FULL_NAME); 
+0

테이블에 행이 많으면 엔진에서 테이블 스캔을 수행해야하는데, 원하지 않을지도 모르는'toLower (FULL_NAME) '을 수행해야합니다. 한 가지 대안은 그것을 모두 소문자로 저장하거나 검색을 위해서만 사용하는 다른 열을 추가하여 소문자로 저장하는 것입니다. – Augusto

답변

0

어떤 데이터베이스를 사용하고 있습니까? MySQL LIKE는 CHAR, VARCHAR 및 TEXT 열에 대해 대소 문자를 구분하지 않습니다 (SQL Server에서도 마찬가지입니다).

http://dev.mysql.com/doc/refman/5.5/en/case-sensitivity.html

당신은 PostgreSQL을를 사용하는 경우, 당신은 당신이 Restrictions.ilike ("fullName의"이름)을 사용하는 것이 좋습니다 있도록 ILIKE 연산자를 사용하는 것이 좋습니다. 나는 두 가지 옵션을 볼

0

, 1

옵션 :

private void searchByFullName(DetachedCriteria criteria, String searchCriteria) { 
      criteria.add(Restrictions.like("toLower(fullName)", "%" + searchCriteria.toLowerCase() + "%")); 
      criteria.addOrder(Order.asc("fullName")); 
    } 

옵션 2 :

private void searchByFullName(DetachedCriteria criteria, String searchCriteria) { 
       criteria.add(Restrictions.sqlRestriction("toLower({alias}.fullName) LIKE '%" + searchCriteria.toLowerCase() + "%'")); 
       criteria.addOrder(Order.asc("fullName")); 
     } 

내가 1 옵션 2 작동합니다 옵션에 대해 매우 낙관적 아니다 물론. {alias}은 SQL을 생성 할 때 테이블에 대한 적절한 별칭을 추가해야한다는 것을 Hibernate가 알 수 있도록하는 자리 표시 자이다. More info http://docs.jboss.org/hibernate/core/3.5/api/org/hibernate/criterion/Restrictions.html#sqlRestriction%28java.lang.String%29

관련 문제