문제

Java App의 ORM 용 Hibernate를 Oracle 데이터베이스에 사용하고 있습니다 (데이터베이스 공급 업체가 문제가되지 않고 언젠가 다른 데이터베이스로 전환 할 수 있음), 사용자 제공 문자열에 따라 데이터베이스에서 객체를 검색하고 싶습니다. 예를 들어, 사람들을 검색 할 때 사용자가 '프랜'에 사는 사람들을 찾고 있다면 샌프란시스코의 사람들을 줄 수 있기를 원합니다.

SQL은 나의 강한 소송이 아니며, 나는 최대 절전 모드를 선호합니다. Criteria 하드 코딩 된 문자열에 대한 건축 코드. 누구든지 코드 에서이 작업을 수행하는 방법에 대한 올바른 방향으로, 그리고 불가능한 경우 하드 코딩 된 SQL이 어떻게 생겼는지 지적 할 수 있습니까?

감사,

유발 = 8-)

도움이 되었습니까?

해결책

설명하는 간단한 경우, extrictions.ilike ()를보십시오.

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

다른 팁

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

Spring의 HibernateTemplate를 사용하여 최대 절전 모드와 상호 작용하는 경우 사용자의 이메일 주소에서 사례 검색을 수행하는 방법은 다음과 같습니다.

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

또한 '%'와일드 카드를 넣을 필요는 없습니다. 당신은 통과 할 수 있습니다 매치 모드 (이전 릴리스 문서는 여기에 있습니다) 검색을 통해 행동하는 방법을 알려줍니다. START, ANYWHERE, EXACT, 그리고 END 일치는 옵션입니다.

사례를 무시하기위한 일반적인 접근 방식은 데이터베이스 값과 입력 값을 모두 위 또는 소문자로 변환하는 것입니다. 결과 SQL은

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

최대 절전 모드 기준 제한 제한 (...). IgnoreCase ()

나는 nhibernate에 더 익숙하기 때문에 구문이 100% 정확하지 않을 수 있습니다.

더 많은 정보는 참조하십시오 Pro Hibernate 3 추출물 그리고 최대 절전 모드 DOCS 15.2. 결과 세트를 좁 힙니다

대부분의 기본 데이터베이스 콜라이트는 대소 문자에 민감하지 않지만 SQL Server 세계에서는 인스턴스, 데이터베이스 및 열 레벨에서 설정할 수 있습니다.

Lucene 위의 Compass A Wrapper를 사용하는 것을 볼 수 있습니다.

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

도메인 객체에 몇 가지 주석을 추가하면 이런 종류의 일을 달성하게됩니다.

Compass는 Lucene과 함께 일하기위한 간단한 API를 제공합니다. ORM을 사용하는 방법을 알고 있다면 저장 및 삭제 및 쿼리를위한 간단한 작업으로 나침반으로 집에서 바로 느낄 수 있습니다.

사이트 자체에서. "Lucene 위에 구축 된 Compass는 Google 스타일 검색, 인덱스 업데이트 및 캐싱 및 인덱스 샤딩 (하위 인덱스)과 같은 고급 개념과 같은 Lucene의 일반적인 사용 패턴을 단순화합니다. 합병. "

나는 과거에 이것을 사용했고 나는 그것이 훌륭하다고 생각합니다.

이것은 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();
}

위의 것을 달성하는 데 유용한 또 다른 방법.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top