2014-07-14 1 views
3

나는 (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를 사용하지 않고이 쿼리를 구현할 수있는 방법이 있습니까? 또는 네이티브 쿼리를 사용하지 않고?

+0

대/소문자를 구분하지 않고 악센트가없는 검색을 수행하려는 경우 악센트가없는 소문자 (대문자이지만 단 하나의 경우)로 데이터베이스에 값을 저장해야합니다. –

+0

음, 악센트가 있거나없는 텍스트는 복제 될 수 있지만 JPA를 사용하고 데이터베이스를 건드리지 않는보다 우아한 솔루션을 찾고있었습니다. – lrd1967

+0

어쨌든 인덱싱 된 쿼리를 허용하려면 UPPER TRANSLATE 함수를 사용하여 인덱스해야합니다. –

답변

1

개인적인 견해로는 가장 우아한 해결책은 실제로 데이터를 복제하여 정규화 된 형식으로 변환하는 것입니다. 쿼리에서 LIKE 조건을 사용하고 있는데, 이는 정상적인 (전체 텍스트 부족) 인덱싱 메커니즘을 기본적으로 배제합니다. 즉, TRANSLATE 쿼리는 비효율적이며 최적화하기가 어려울 것입니다. JPA를 사용

, 당신은 매우 편리한 방식으로 표준화 된 양식을 관리하는 엔티티 라이프 사이클 이벤트를 사용할 수있다 :

@Entity 
public class Whatever implements Serializable { 
    private static final long serialVersionUID = 0L; 

    private String string; 
    private String normalizedString; 

    // getters and setters 

    @PreUpdate 
    @PrePersist 
    protected void normalize() { 
     normalizedString = yourNormalizationMethod(string); 
    } 
} 

내가이 깨끗한, 가장 우아하고, 대부분의 데이터베이스 불가지론 방법이 생각 이러한 유형의 문제를 해결할 수 있습니다.

관련 문제