Pregunta

Hola chicos estoy teniendo algunos problemas con coincidencias exactas mientras se hace un NamedQuery.

Actualmente estoy usando algo como esto:

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

Funciona para la mayoría de los casos, sin embargo, me di cuenta de que en caso de que el usuario pase el nombre del archivo con un espacio al final, la namedQuery hace caso omiso de ese personaje. Por ejemplo:

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

devolverá el mismo resultado que la consulta antes. Sin pasar por mi validación 'entrada válida'. En otras palabras, me gustaría tener la consulta para devolver ninguna entrada en absoluto y el error de tratar más adelante.

Una solución que podía pensar, es poner comillas simples que rodea mi parámetro en el namedQuery, como esto:

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

Sin embargo, será la basura mi código en caso de que la cadena contiene comillas simples en ella ...

Cualquier chicos ideas?

¿Fue útil?

Solución 2

Hice algunas investigaciones en APP y descubrí que lo hace algo de limpieza automática para CHAR, no estoy seguro si esto comporta de la misma con las cadenas, pero ya que me está pasando ... creo que sí. La única manera de evitar es mediante el establecimiento de algún atributo en el objeto de sesión DatabaseLogin (ver http://www.eclipse.org/eclipselink/api/1.1/org/eclipse/persistence/sessions/DatabaseLogin.html#setShouldTrimStrings ).

Bueno, yo no quería ser echar a perder con las propiedades de la sesión, así que decidí hacer algún tipo de comprobación y lanzando la misma excepción que la captura NoResultException hace en mi código.

Yo, básicamente, tomó el resultado de la base de datos y se compara el campo con la cadena que se utiliza:

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

...

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

También tenía que incluir la función Trim axtavt! Esto es sólo para asegurarse de que si la base de datos tiene una columna con espacios a la derecha y que coincida con el parámetro dado por el usuario, que será incluido como una respuesta válida. Por ejemplo:

Hoja de datos que:. Name = "Flavio" - Ajustado con función = "Flavio"

parámetro pasado:. Name = "Flavio" - Recortado por APP función automática = "Flavio"

Si isnt recortado en todo lo que se acaba de comparación "Flavio" con "Flavio", volviendo noresult cuando se supone que devuelve esa entrada.

solución desagradable, pero siempre y cuando no hay otra manera de detener el auto-recorte tendremos que acaba de hacer uso de este tipo de cosas.

Gracias por todas las otras respuestas !!

Otros consejos

Creo que esto se debe a que su campo de base de datos se declara como CHAR(...), y por lo tanto, los valores almacenados se rellenan con espacios en blanco que no son tenidos en cuenta por la operación =.

Por lo tanto, es posible declarar ya sea su campo de base de datos como VARCHAR(...) o utilizar una función integrada de trim:

query = "select e from Entry e where trim(trailing from e.name) =:"+ Entry.NAME
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top