Por ejemplo, tengo esa consulta:
Query q = sess.createQuery("from Cat cat");
List cats = q.list();
Si trato de hacer algo como esto, muestra la siguiente advertencia
Type safety: The expression of type List needs unchecked conversion to conform to List<Cat>
List<Cat> cats = q.list();
¿Hay alguna forma de evitarlo?
sess.createQuery("from Cat cat", Cat.class);
como mencionó Elazar.Respuestas:
Usar en
@SuppressWarnings
todas partes, como se sugiere, es una buena manera de hacerlo, aunque implica escribir un poco con el dedo cada vez que llamaq.list()
.Hay otras dos técnicas que sugeriría:
Escribe un ayudante de reparto
Simplemente refactorice todo
@SuppressWarnings
en un solo lugar:Evite que Eclipse genere advertencias por problemas inevitables
En Eclipse, vaya a Ventana> Preferencias> Java> Compilador> Errores / Advertencias y en Tipo genérico, seleccione la casilla de verificación
Ignore unavoidable generic type problems due to raw APIs
Esto desactivará las advertencias innecesarias para problemas similares como el descrito anteriormente que son inevitables.
Algunos comentarios:
Query
lugar del resultado deq.list()
porque de esa manera este método de "trampa" solo se puede usar para hacer trampa con Hibernate, y no para engañar a nadieList
en general..iterate()
etc.fuente
Collections.checkedList()
método no suprimirá la advertencia de asignación no marcada.Ha pasado mucho tiempo desde que se hizo la pregunta, pero espero que mi respuesta pueda ser útil para alguien como yo.
Si echa un vistazo a los documentos de la API de javax.persistence , verá que desde entonces se han agregado algunos métodos nuevos
Java Persistence 2.0
. Uno de ellos es elcreateQuery(String, Class<T>)
que vuelveTypedQuery<T>
. Puede usarloTypedQuery
tal como lo hizoQuery
con esa pequeña diferencia de que ahora todas las operaciones son seguras de tipos.Entonces, simplemente cambie su código a algo como esto:
Y ya está todo listo.
fuente
También usamos
@SuppressWarnings("unchecked")
, pero la mayoría de las veces intentamos usarlo solo en la declaración de la variable, no en el método en su conjunto:fuente
Intente usar en
TypedQuery
lugar deQuery
. Por ejemplo, en lugar de esto: -Utilizar este:-
fuente
Criteria
?En nuestro código anotamos los métodos de llamada con:
@SuppressWarnings ("sin marcar")
Sé que parece un truco, pero un co-desarrollador lo comprobó recientemente y descubrió que era todo lo que podíamos hacer.
fuente
Aparentemente, el método Query.list () en la API de Hibernate no es seguro para tipos "por diseño", y no hay planes para cambiarlo .
Creo que la solución más simple para evitar las advertencias del compilador es agregar @SuppressWarnings ("sin marcar"). Esta anotación se puede colocar a nivel de método o, si está dentro de un método, justo antes de una declaración de variable.
En caso de que tenga un método que encapsule Query.list () y devuelva List (o Collection), también recibirá una advertencia. Pero este se suprime usando @SuppressWarnings ("rawtypes").
El método listAndCast (Query) propuesto por Matt Quail es menos flexible que Query.list (). Mientras puedo hacer:
Si intento el siguiente código:
Recibiré un error de compilación: no coinciden los tipos: no se puede convertir de List a ArrayList
fuente
No es un descuido ni un error. La advertencia refleja un problema subyacente real: no hay forma de que el compilador de Java pueda estar realmente seguro de que la clase de hibernación va a hacer su trabajo correctamente y que la lista que devuelve solo contendrá Cats. Cualquiera de las sugerencias aquí está bien.
fuente
No, pero puede aislarlo en métodos de consulta específicos y suprimir las advertencias con una
@SuppressWarnings("unchecked")
anotación.fuente
Las versiones más recientes de Hibernate ahora admiten un
Query<T>
objeto de tipo seguro para que ya no tenga que usar@SuppressWarnings
o implementar algún truco para que desaparezcan las advertencias del compilador. En la API de sesión ,Session.createQuery
ahora devolverá unQuery<T>
objeto de tipo seguro . Puedes usarlo de esta manera:También puede usarlo cuando el resultado de la consulta no devuelva un gato:
O al hacer una selección parcial:
fuente
Tuvimos el mismo problema. Pero no fue un gran problema para nosotros porque teníamos que resolver otros problemas más importantes con Hibernate Query and Session.
Específicamente:
Entonces, para nosotros, tenemos:
Y por último,
AmplafiQuery tiene un "asList ()" que es una versión genérica habilitada de Query.list () AmplafiQuery tiene un "unique ()" que es una versión genérica habilitada de Query.uniqueResult () (y solo registra un problema en lugar de lanzar un excepción)
Esto es mucho trabajo simplemente para evitar @SuppressWarnings. Sin embargo, como dije (y enumeré), ¡hay muchos otros mejores! razones para hacer el trabajo de envoltura.
fuente
Sé que esto es más antiguo, pero hay 2 puntos a tener en cuenta a partir de hoy en Matt Quails Answer.
Punto 1
Esta
Debería ser esto
Punto 2
De esto
a esto
reduciría otras advertencias, obviamente en el navegador, los marcadores de etiquetas de respuesta originales fueron eliminados.
fuente
Prueba esto:
fuente
cat
instancia.Una buena solución para evitar advertencias de seguridad de tipos con consultas de hibernación es usar una herramienta como TorpedoQuery para ayudarlo a construir un hql seguro de tipos.
fuente
fuente
Si no desea utilizar @SuppressWarnings ("sin marcar"), puede hacer lo siguiente.
FYI: creé un método util que hace esto por mí para que no ensucie mi código y no tenga que usar @SupressWarning.
fuente