나는 (http://www.guj.com.br/java/212706-accent-insensitive-hibernate 기준) 경우 또는 사용 악센트의 parcial 텍스트 독립를 검색 할 JPA2에 네이티브 쿼리를 사용하여이 쿼리를 가지고 :JPA2 기준 악센트를 구분
public List<Hipotesis> findHipotesisByText(String srchtext) {
EntityManager em = getEntityManager();
String textNormalized =
Normalizer.normalize(srchtext, Normalizer.Form.NFD).replaceAll("[^\\p{ASCII}]", "").toUpperCase();
Query query =
em.createNativeQuery(
"select * from HIPOTESIS where (UPPER(TRANSLATE(TEXTFIELD,'ÀÁÂÃáàâãÉÈÊéèêÍíÓÒÔÕóòôõÚÜúü','AAAAaaaaEEEeeeIiOOOOooooUUuu')) like '%" + textNormalized + "%'",
Hipotesis.class);
@SuppressWarnings("unchecked")
List<Hipotesis> results = query.getResultList();
return results;
}
검색 텍스트로 정규화 악센트를 벗기고 대문자로 변환됩니다. 네이티브 쿼리는 TRANSLATE를 사용하여 악센트를 순수 텍스트로 변환하고 UPPER는 결과를 대문자로 변환합니다.
따라서 검색 텍스트 eMeRgÊ는 EMERGE로 정규화되며 emergencia, emergência, Emergência와 같은 데이터베이스의 모든 항목과 일치합니다.
TRANSLATE는 SQL99에 의해 지정되지만 표준과 완전히 동일하게 지원되거나 구현되지는 않습니다.
질문 : TRANSLATE를 사용하지 않고이 쿼리를 구현할 수있는 방법이 있습니까? 또는 네이티브 쿼리를 사용하지 않고?
대/소문자를 구분하지 않고 악센트가없는 검색을 수행하려는 경우 악센트가없는 소문자 (대문자이지만 단 하나의 경우)로 데이터베이스에 값을 저장해야합니다. –
음, 악센트가 있거나없는 텍스트는 복제 될 수 있지만 JPA를 사용하고 데이터베이스를 건드리지 않는보다 우아한 솔루션을 찾고있었습니다. – lrd1967
어쨌든 인덱싱 된 쿼리를 허용하려면 UPPER TRANSLATE 함수를 사용하여 인덱스해야합니다. –