Por exemplo, eu tenho essa consulta:
Query q = sess.createQuery("from Cat cat");
List cats = q.list();
Se eu tentar fazer algo assim, mostrará o seguinte aviso
Type safety: The expression of type List needs unchecked conversion to conform to List<Cat>
List<Cat> cats = q.list();
Existe uma maneira de evitá-lo?
sess.createQuery("from Cat cat", Cat.class);
como Elazar mencionou.Respostas:
Usar em
@SuppressWarnings
qualquer lugar, conforme sugerido, é uma boa maneira de fazer isso, embora envolva digitar um pouco o dedo cada vez que você ligarq.list()
.Existem duas outras técnicas que eu sugiro:
Escreva um elenco auxiliar
Simplesmente refatore tudo
@SuppressWarnings
em um só lugar:Impedir que o Eclipse gere avisos para problemas inevitáveis
No Eclipse, vá para Janela> Preferências> Java> Compilador> Erros / Avisos e em Tipo genérico, selecione a caixa de seleção
Ignore unavoidable generic type problems due to raw APIs
Isso desativará avisos desnecessários para problemas semelhantes, como o descrito acima, que são inevitáveis.
Alguns comentários:
Query
vez do resultado deq.list()
porque dessa forma este método de "trapaça" só pode ser usado para trapacear com o Hibernate, e não para trapacearList
em geral..iterate()
etc.fonte
Collections.checkedList()
método não suprimirá o aviso de atribuição não verificada.Já se passou muito tempo desde que a pergunta foi feita, mas espero que minha resposta possa ser útil para alguém como eu.
Se você der uma olhada nos documentos da API javax.persistence , verá que alguns novos métodos foram adicionados lá desde então
Java Persistence 2.0
. Um deles é ocreateQuery(String, Class<T>)
que retornaTypedQuery<T>
. Você pode usarTypedQuery
da mesma forma,Query
com aquela pequena diferença de que todas as operações agora são seguras para tipos.Então, apenas altere seu código para smth assim:
E você está pronto.
fonte
Usamos
@SuppressWarnings("unchecked")
também, mas na maioria das vezes tentamos usá-lo apenas na declaração da variável, não no método como um todo:fonte
Tente usar em
TypedQuery
vez deQuery
. Por exemplo, em vez deste: -Usa isto:-
fonte
Criteria
?Em nosso código, anotamos os métodos de chamada com:
@SuppressWarnings ("desmarcado")
Eu sei que parece um hack, mas um co-desenvolvedor verificou recentemente e descobriu que era tudo o que podíamos fazer.
fonte
Aparentemente, o método Query.list () na API do Hibernate não é seguro para o tipo "por design" e não há planos para alterá-lo .
Eu acredito que a solução mais simples para evitar avisos do compilador é adicionar @SuppressWarnings ("desmarcado"). Essa anotação pode ser colocada no nível do método ou, se estiver dentro de um método, logo antes de uma declaração de variável.
Caso você tenha um método que encapsula Query.list () e retorna List (ou Collection), você também receberá um aviso. Mas este é suprimido usando @SuppressWarnings ("rawtypes").
O método listAndCast (Query) proposto por Matt Quail é menos flexível que Query.list (). Enquanto eu posso fazer:
Se eu tentar o código abaixo:
Vou obter um erro de compilação: incompatibilidade de tipo: não é possível converter de List para ArrayList
fonte
Não é um descuido ou um erro. O aviso reflete um problema real subjacente - não há como o compilador java realmente ter certeza de que a classe de hibernação fará seu trabalho corretamente e que a lista que ela retorna conterá apenas Cats. Qualquer uma das sugestões aqui está bem.
fonte
Não, mas você pode isolá-lo em métodos de consulta específicos e suprimir os avisos com uma
@SuppressWarnings("unchecked")
anotação.fonte
Versões mais novas do Hibernate agora suportam um
Query<T>
objeto de tipo seguro, então você não precisa mais usar@SuppressWarnings
ou implementar algum hack para fazer os avisos do compilador desaparecerem. Na API de sessão ,Session.createQuery
agora retornará umQuery<T>
objeto de tipo seguro . Você pode usá-lo desta forma:Você também pode usá-lo quando o resultado da consulta não retornar um gato:
Ou ao fazer uma seleção parcial:
fonte
Tivemos o mesmo problema. Mas não foi um grande problema para nós porque tínhamos que resolver outros problemas mais importantes com o Hibernate Query e Session.
Especificamente:
Então, para nós, temos:
E por fim,
AmplafiQuery tem um "asList ()" que é uma versão genérica habilitada de Query.list () AmplafiQuery tem um "unique ()" que é uma versão genérica habilitada de Query.uniqueResult () (e apenas registra um problema em vez de lançar um exceção)
Isso é muito trabalho apenas para evitar @SuppressWarnings. No entanto, como eu disse (e listei), existem muitos outros melhores! razões para fazer o trabalho de embrulho.
fonte
Eu sei que isso é mais antigo, mas 2 pontos a serem observados a partir de hoje em Matt Quails Answer.
Ponto 1
este
Deveria ser isso
Ponto 2
Deste
para isso
reduziria outros avisos obviamente em marcadores de tag de resposta originais foram removidos pelo navegador.
fonte
Experimente isto:
fonte
cat
instância.Uma boa solução para evitar avisos de segurança de tipo com consulta de hibernação é usar uma ferramenta como TorpedoQuery para ajudá-lo a construir hql de tipo seguro.
fonte
fonte
Se você não quiser usar @SuppressWarnings ("unchecked"), você pode fazer o seguinte.
Para sua informação - criei um método utilitário que faz isso para mim, de forma que não bagunce meu código e não precise usar @SupressWarning.
fonte