2011-02-17 4 views
9

숫자와 문자가 섞여있는 티켓 번호가 있습니다. 나는이 방법 (사용자 입력)에 ticketNumberIds을 전달할 것이고 나는 오라클 데이터베이스에 대해 질의하고 쿼리가 대문자와 소문자가 다른 티켓을 가져 오도록하고 싶습니다.대/소문자를 구분하지 않는 쿼리

대/소문자를 구분하지 않는 쿼리는 어떻게 작성합니까?

public List<TicketDO> getTicketDOsById(final List<String> ticketNumberIds) { 

    String myQuery = "from TicketDO t where t.ticketNumberId in (:ticketNumberIds)"; 

    return getEntityManager().createQuery(myQuery).setParameter("ticketNumberIds", ticketNumberIds) 
    .getResultList(); 

} 

답변

25

대문자와 소문자를 구분하지 않는 쿼리를 수행 할 수 있습니다.

public List<TicketDO> getTicketDOsById(final List<String> ticketNumberIds) { 

    String myQuery = "from TicketDO t where UPPER(t.ticketNumberId) in (:ticketNumberIds)"; 
    List<String> upperNumbers = new ArrayList<String>(); 
    for (String number : ticketNumberIds) { 
     upperNumbers.add(number.toUppercase()); 
    } 
    return getEntityManager().createQuery(myQuery).setParameter("ticketNumberIds", upperNumbers) 
    .getResultList(); 

} 
+1

이것은 저에게 적합하지 않습니다. Derby 데이터베이스에서 실행 중입니다. 이것이 방언 불일치로 인한 것일 수 있습니까? –

+0

나는 Derby도 사용하고 있으며 잘 작동합니다. 정교한 케어? –

+0

이것은 DB에서 테이블 스캔을 강제 실행하므로 티켓 번호가 ticketNumberId 인 경우 사용되지 않을 가능성이 높습니다. 이 문제를 피하기 위해 엔티티 설정자에서 대문자로 변환 할 수 있으므로 모든 티켓 번호는 .persist() 중에 대문자로 저장됩니다. 그런 다음 위의 코드에서 UPPER() 함수가 더 이상 필요하지 않으므로 해당 열의 모든 인덱스를 사용할 수 있습니다. – DTs

관련 문제