Domanda

Ciao ragazzi io sto avendo alcuni problemi con corrispondenze esatte mentre facendo un NamedQuery.

Attualmente sto usando qualcosa di simile:

@NamedQuery(name = MyClass.GET_ENTRY_BY_NAME, query = "select e from Entry e where e.name =:"+ Entry.NAME )

...

Query query = em.createNamedQuery(MyClass.GET_ENTRY_BY_NAME);
        query.setParameter(Entry.NAME, myEntry.getName());

Si lavora per la maggior parte dei casi, tuttavia ho notato che nel caso in cui l'utente passare il nome del file con uno spazio alla fine, la namedQuery ignora quel personaggio. Ad esempio:

Query query = em.createNamedQuery(MyClass.GET_ENTRY_BY_NAME);
        query.setParameter(Entry.NAME, myEntry.getName()+ " ");

restituirà il stesso risultato della query prima. Bypassare la mia convalida 'voce valida'. In altre parole, mi piacerebbe la query per restituire alcuna voce a tutti e trattare l'errore più tardi.

Una soluzione ho potuto pensare, è quello di mettere le virgolette singole che circonda il mio parametro nel namedQuery, in questo modo:

@NamedQuery(name = MyClass.GET_ENTRY_BY_NAME, query = "select e from entry e where e.name =':"+ Entry.NAME "'")

Tuttavia sarà rovinerà il mio codice nel caso in cui la stringa contiene virgolette singole in esso ...

Tutte le idee ragazzi?

È stato utile?

Soluzione 2

Ho fatto qualche ricerca in APP e ha scoperto che lo fa qualche sbavatura automatica per i caratteri, io non so se questo si comporta allo stesso con le stringhe, ma dal momento che sta accadendo a me ... Credo di sì. L'unico modo per by-pass è impostando un attributo all'interno dell'oggetto sessione DatabaseLogin (vedi http://www.eclipse.org/eclipselink/api/1.1/org/eclipse/persistence/sessions/DatabaseLogin.html#setShouldTrimStrings ).

Beh io non voleva essere incasinare con le proprietà della sessione così ho deciso di fare una sorta di controllo e gettando la stessa eccezione come il fermo NoResultException fa nel mio codice.

In pratica ho preso il risultato dal database e confrontato il campo con la stringa che ho usato:

query.setParameter(Entry.NAME, myEntry.getName());

...

if(!StringUtils.equals(result.getName(), myEntry.getName()){
   do a cool throw just like NoResultException Catch
}

I ha avuto anche per includere la funzione Trim axtavt! Questo è solo per fare in modo che se il database ha una colonna con gli spazi finali e corrisponde al parametro dato dall'utente, sarà incluso come una risposta valida. Ad esempio:

voce del database:. Name = "Flavio" - sezionato con funzione = "Flavio"

parametro passato:. Name = "Flavio" - Disegnato da JPA funzione automatica = "Flavio"

Se isnt rifilata a tutti sarà solo Confronto "Flavio" con "Flavio", tornando NoResult quando doveva tornare quella voce.

soluzione Brutto, ma finché non c'è altro modo per fermare l'auto-taglio dovremo solo fare uso di questo genere di cose.

Grazie per tutte le altre risposte !!

Altri suggerimenti

Credo che questo accade perché il campo del database è dichiarato come CHAR(...), e di conseguenza i valori memorizzati sono imbottiti con spazi bianchi che non sono presi in considerazione dal funzionamento =.

Quindi, si può sia dichiarare il vostro campo di database come VARCHAR(...) o utilizzare un built-in funzione di trim:

query = "select e from Entry e where trim(trailing from e.name) =:"+ Entry.NAME
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top