2008-09-23 4 views
46

Java 응용 프로그램 ORM에 Oracle 데이터베이스를 사용하고 있습니다 (데이터베이스 공급 업체의 문제가 아니며 언젠가 다른 데이터베이스로 전환 할 수 있음). 사용자 제공 문자열에 따라 데이터베이스. 예를 들어 사람을 검색 할 때 '프랑 (fran)'에 거주하는 사람을 찾는 경우 샌프란시스코에있는 사람들에게 줄 수 있기를 원합니다.Hibernate를 사용하여 대/소문자를 구분하지 않는 검색

SQL이 강점이 아니기 때문에 하드 코드 된 문자열에 Hibernate의 Criteria 건물 코드를 그대로 두는 편이 더 좋습니다. 코드에서이 작업을 수행하는 방법에 대해 올바른 방향으로 알려줄 수 있습니까? 불가능할 경우 하드 코딩 된 SQL이 어떻게 나타나야합니까?

감사합니다,

Yuval 교수 = 8)

답변

67

간단히 설명하면 대소 문자를 구분하지 않는 Restrictions.ilike()를 살펴보십시오.

Criteria crit = session.createCriteria(Person.class); 
crit.add(Restrictions.ilike('town', '%fran%'); 
List results = crit.list(); 
+0

덕분에 ... ILIKE 최대 절전 모드 = 8) – Yuval

+9

에 그리고 난 그냥이 밖으로 시도 –

+6

NHibernate에 해당하는 시도 '() InsensitiveLike'를 찾는 사람을 위해 존재를 인식하지 않았다. 대소 문자를 구별하지 않습니다. –

0

대부분의 기본 데이터베이스 데이터 정렬은 대소 문자를 구분하지 않습니다,하지만 SQL 서버의 세계에서이 인스턴스, 데이터베이스 및 열 수준에서 설정할 수 있습니다 .

0

lucene 위의 래퍼를 나침반으로 볼 수 있습니다. 도메인에 몇 가지 주석을 추가함으로써

http://www.compass-project.org/

는 이런 종류의 일을 달성받을 객체.

컴퍼스는 Lucene을 사용하기위한 간단한 API를 제공합니다. ORM을 사용하는 방법을 알고 있다면 간단한 조작으로 나침반을 사용하여 편안함을 느낄 수 있으며 & 쿼리를 삭제할 수 있습니다.

사이트 자체입니다. "Lucene 위에 구축 된 Compass는 Google 스타일 검색, 색인 업데이트 및 캐싱 및 색인 샤딩 (하위 색인)과 같은 고급 개념과 같은 Lucene의 일반적인 사용 패턴을 단순화합니다. 또한 Compass는 동시 커밋에 대해 내장 최적화 기능을 사용합니다 그리고 합병. "

나는 이것을 과거에 사용해 왔는데, 나는 그것을 크게 발견했다.

3

사건을 무시하는 일반적인 접근 방식은 대문자 또는 소문자로 데이터베이스 값과 입력 값을 모두 변환하는 것입니다 - 결과 SQL가 최대 절전 기준에

select f.name from f where TO_UPPER(f.name) like '%FRAN%' 

이 restrictions.like 같은 것을 할 것이다 (.. .).하여 ignoreCase 참조 구문이 좀 더 많은 정보를 원하시면 100 % 정확한

하지 않을 수 있도록()

내가 NHibernate에 더 잘 알고 pro hibernate 3 extracthibernate docs 15.2. Narrowing the result set

+0

최대 절전 모드 버전 3.6.1의 경우 결과 집합을 좁히는 섹션은 17.2입니다. [링크] (http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#querycriteria-narrowing) – zmf

+0

선생님, 두 링크가 유효하지 않습니다. –

4

또한 '%'와일드 카드를 넣지 않아도됩니다. 검색 방법을 알려면 MatchMode (docs for previous releases here)을 전달하면됩니다. START, ANYWHERE, EXACTEND이 옵션입니다., 이것은 또한 예 기준을 사용하여 수행 할 수 있습니다

getHibernateTemplate().find("from User where upper(email)=?", emailAddr.toUpperCase()); 
9

당신은 여기에 당신이 사용자의 이메일 주소에 대소 문자를 구분 검색을 수행 할 어떻게, 최대 절전 모드와 상호 작용하는 스프링의 HibernateTemplate에를 사용하는 경우 org.hibernate.criterion 패키지에있다.

public List findLike(Object entity, MatchMode matchMode) { 
    Example example = Example.create(entity); 
    example.enableLike(matchMode); 
    example.ignoreCase(); 
    return getSession().createCriteria(entity.getClass()).add(
      example).list(); 
} 

위의 작업을 수행하는 데 유용한 또 다른 방법입니다.

+0

이 댓글 정말 도움 당신은 해결 방법을 사용할 수 있습니다 내 응용 프로그램에서 나는 다음과 같은 코드가있다 :'User u = new User(); u.set 사용자 이름 (사용자 이름); 목록 목록 = HibernateTemplate.findByExample ()'데이터베이스에서 사용자를 찾으십시오. 그러나 이것은 내가 그것을 제공하고있는 경우 사용자 이름을 사용하고 있습니다. 하지만 대/소문자를 구분하지 않는 검색을 수행하는 쿼리를 작성하여 다음과 같이 SamS에 표시된 것처럼 찾기를 사용했습니다. List list = HibernateTemplate.find ("user from upper (username) =?", u.getUsername() .toUpperCase()); – amit

36
Criteria crit = session.createCriteria(Person.class); 
crit.add(Restrictions.ilike('town', 'fran', MatchMode.ANYWHERE); 
List results = crit.list(); 
관련 문제