2011-02-17 23 views
9

Numaraları ve harfleri karışık olabilecek bazı bilet numaralarim var. Bu yönteme (kullanıcı girişi) ticketNumberIds'dan geçeceğim ve Oracle veritabanına karşı sorgulamasını ve üst ve alt durumlara göre farklılık gösteren sorgu alma bileti almasını istiyorum.Büyük/küçük harf duyarlı Sorgu

Aşağıdakileri büyük/küçük harfe duyarlı olmayan bir sorguyu nasıl yaparım?

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

} 

cevap

25

Büyük/küçük harfe duyarlı olmayan sorgular yapmak için UPPER kullanabilirsiniz.

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

Bu benim için çalışmıyor, bir Derby veritabanında çalışıyorum. Bunun bir çeşit lehçe uyuşmazlığı olabilir mi? –

+0

Ben de Derby kullanıyorum ve gayet iyi çalışıyor. Detaylandırmaya özen gösterilsin mi? –

+0

Bunun büyük olasılıkla DB'de Tablo Taramasını zorlayacağını unutmayın, böylece ticketNumberId üzerinde bir dizininiz varsa büyük olasılıkla kullanılmayacaktır. Bu sorunu önlemek için, varlık ayarlayıcınızdaki büyük harflere dönüştürebilirsiniz, böylece tüm bilet numaraları .persist() sırasında Büyük harf olarak saklanır. Ardından yukarıdaki kodda UPPER() işlevi kalmaz ve dolayısıyla bu sütundaki herhangi bir dizin kullanılabilir durumda kalır. – DTs

İlgili konular