ricerca case-insensitive in EJB-QL
Domanda
Questo sembra davvero semplice e io non posso credere che non ho trovato una soluzione per me.Ho un bean denominato PersonBean, che ha un nome.Ora voglio scrivere un metodo di ricerca che prende una stringa e la ricerca persone con la stringa in loro nome, caso maiuscole e minuscole).Ecco la mia attuale EJB-QL:
SELECT OBJECT(p)
FROM Person p
WHERE (p.name LIKE ?1)
Ho 2 problemi con questa:
- Voglio la ricerca case-insensitive (di cui sopra è case-sensitive) e non riesco a trovare qualcosa di simile
lower()
oupper()
in EJB-QL.Cosa posso fare per avere quel comportamento? AGGIORNAMENTO:Sto usando J2EE versione 1.4 e glassfish versione 2.1, se quello che conta. - Devo passare un brutto stringa con il metodo che ho.e
findByString("%john%")
.C'è un modo per scrivere il EJB-QL modo che io possa passare qualcosa di similefindByString("john")
?
Soluzione
Per quanto riguarda la tua seconda domanda, c'è un CONCAT
funzione in EJB-QL 2.1, quindi penso che dovrebbe funzionare:
DOVE (p.nome COME CONCAT('%', CONCAT(?1, '%')))
Edit: Non perché il ql di grammatica consente solo le stringhe letterali e i parametri di input in un LIKE
l'espressione, che è davvero limitante.Dovrebbe essere possibile ottenere lo stesso effetto utilizzando il LOCATE
funzione come questa:
WHERE LOCATE(p.name, ?1) <> 0
Altri suggerimenti
EJB-QL utilizzato in EJB 2.x gli entity bean (da non confondere con JPQL utilizzato in EJB3, JPA e gli entity bean) è estremamente limitata.Ci sono stati dei castelli alcune aggiunte per la lingua in EJB 2.1, che sono le mie convinzioni non superiore/inferiore di funzioni.
Non so cosa contenitore in esecuzione, ma JBoss ha fatto alcune estensioni per EJB-QL (chiamato JBossQL) e dispone di un UCASE funzione.