For example I have such query:
Query q = sess.createQuery("from Cat cat"); List cats = q.list();
If I try to make something like this it shows the following warning
Type safety: The expression of type List needs unchecked conversion to conform to List<Cat> List<Cat> cats = q.list();
Is there a way to avoid it?
Both HQL and JPQL are non-type-safe ways to perform query operations. Criteria queries offer a type-safe approach to querying.
I know hibernate does not support union queries at the moment, right now the only way I see to make a union is to use a view table.
Hibernate Query Language (HQL) is an object-oriented query language, similar to SQL, but instead of operating on tables and columns, HQL works with persistent objects and their properties. HQL queries are translated by Hibernate into conventional SQL queries, which in turns perform action on database.
Unlike SQL, HQL uses classes and properties in lieu of tables and columns. HQL supports polymorphism as well as associations, which in turn allows developers to write queries using less code as compared to SQL.
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:
Query
instead of the result of q.list()
because that way this "cheating" method can only be used to cheat with Hibernate, and not for cheating any List
in general..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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With