2011-02-17 11 views
9

Tengo algunos números de ticket que pueden tener números y letras mezclados. Pasaré el ticketNumberIds a este método (entrada del usuario) y quiero que consulte la base de datos de Oracle y haga que la consulta recoja los tickets que difieren en mayúsculas y minúsculas.Queda insensible a las consultas

¿Cómo hago lo siguiente en una consulta que no distingue entre mayúsculas y minúsculas?

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(); 

} 

Respuesta

25

Puede usar UPPER para realizar consultas que no distinguen entre mayúsculas y minúsculas.

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

Esto no funciona, estoy ejecutando en una base de datos Derby. ¿Podría ser esto debido a algún tipo de discrepancia dialectal? –

+0

Estoy usando Derby también y funciona bien. ¿Cuidado para elaborar? –

+0

Tenga en cuenta que esto probablemente forzará una exploración de tabla en la base de datos, por lo que si tiene un índice en ticketNumberId, probablemente no se utilizará. Para evitar este problema, puede convertir a mayúsculas en su entidad setter, para que todos los números de los tickets se almacenen en mayúsculas durante .persist(). Entonces la función UPPER() ya no es necesaria en el código anterior y, por lo tanto, cualquier índice en esa columna permanece utilizable. – DTs

Cuestiones relacionadas