2011-02-17 4 views
9

J'ai des numéros de tickets qui peuvent avoir des nombres et des lettres mélangés. Je vais passer dans le ticketNumberIds dans cette méthode (entrée utilisateur) et je veux qu'il interroge la base de données Oracle et que la requête prenne des tickets qui diffèrent par majuscules et minuscules.Requête insensible à la casse

Comment faire une requête insensible à la casse?

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

} 

Répondre

25

Vous pouvez utiliser UPPER pour effectuer des requêtes insensibles à la casse.

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

Cela ne fonctionne pas pour moi, je cours sur une base de données Derby. Cela pourrait-il être dû à un type de divergence de dialecte? –

+0

J'utilise aussi Derby et ça marche très bien. Vous voulez élaborer? –

+0

Notez que cela forcera probablement une analyse de table dans la base de données, donc si vous avez un index sur ticketNumberId, il ne sera probablement pas utilisé. Pour éviter ce problème, vous pouvez convertir en majuscules dans votre setter d'entité, de sorte que tous les numéros de tickets soient stockés en majuscule pendant .persist(). Alors la fonction UPPER() n'est plus nécessaire dans le code ci-dessus et donc tout index sur cette colonne reste utilisable. – DTs

Questions connexes