How to avoid type safety warnings with Hibernate HQL results?
Using @SuppressWarnings
everywhere, as suggested, is a good way to do it, though it does involve a bit of finger typing each time you call q.list()
.
There are two other techniques I'd suggest:
Write a cast-helper
Simply refactor all your @SuppressWarnings
into one place:
List<Cat> cats = MyHibernateUtils.listAndCast(q);
...
public static <T> List<T> listAndCast(Query q) {
@SuppressWarnings("unchecked")
List list = q.list();
return list;
}
Prevent Eclipse from generating warnings for unavoidable problems
In Eclipse, go to Window>Preferences>Java>Compiler>Errors/Warnings and under Generic type, select the checkbox
Ignore unavoidable generic type problems due to raw APIs
This will turn off unnecessary warnings for similar problems like the one described above which are unavoidable.
Some comments:
- I chose to pass in the
Query
instead of the result ofq.list()
because that way this "cheating" method can only be used to cheat with Hibernate, and not for cheating anyList
in general. - You could add similar methods for
.iterate()
etc.
It is been a long time since the question was asked but I hope my answer might be helpful to someone like me.
If you take a look at javax.persistence api docs, you will see that some new methods have been added there since Java Persistence 2.0
. One of them is createQuery(String, Class<T>)
which returns TypedQuery<T>
. You can use TypedQuery
just as you did it with Query
with that small difference that all operations are type safe now.
So, just change your code to smth like this:
Query q = sess.createQuery("from Cat cat", Cat.class);
List<Cat> cats = q.list();
And you are all set.
We use @SuppressWarnings("unchecked")
as well, but we most often try to use it only on the declaration of the variable, not on the method as a whole:
public List<Cat> findAll() {
Query q = sess.createQuery("from Cat cat");
@SuppressWarnings("unchecked")
List<Cat> cats = q.list();
return cats;
}
Try to use TypedQuery
instead of Query
.
For example instead of this:-
Query q = sess.createQuery("from Cat cat", Cat.class);
List<Cat> cats = q.list();
Use this:-
TypedQuery<Cat> q1 = sess.createQuery("from Cat cat", Cat.class);
List<Cat> cats = q1.list();
In our code we annotate the calling methods with:
@SuppressWarnings("unchecked")
I know it seems like a hack, but a co-developer checked recently and found that was all we could do.