虽说现在普遍的观点是警告不碍事,基本不管。对于Java的警告,如果有强迫症的话还可以加上@SuppressWarnings("unchecked")注释,但是你没有理由每一个方法都加上这个注释吧?
尤其在Hibernate3.x中query.list()方法,因为其返回结果就是list,因此很容易有Type safety警告。
Hibernate3.x中query.list()方法在每次数据库查询都是存在的。不可能每个涉及查询的方法都加上@SuppressWarnings("unchecked")注释。
网络的一些文章,建议修改Eclipse的编译器,但是你的程序去到别人的程序中同样会有类似的警告。
比如如下的代码:
import java.util.List; import org.hibernate.*; import org.hibernate.cfg.*; public class HibernateWarningTest { public static void main(String[] args) { Session session = new Configuration().configure().buildSessionFactory().openSession(); List<Usertable> usertableList=session.createQuery("from Usertable").list(); for(int i=0;i<usertableList.size();i++){ Usertable usertable=usertableList.get(i); System.out.println(usertable.getId()+","+usertable.getUsername()+","+usertable.getPassword()); } session.close(); } }
相当于如下图,一段很简单的对表usertable查询的SQL:
然而由于HQL的查询方法query.list()返回的是一个没有类型List,即使你前面的List表明这个list生成的是存放Usertable的List也是会如下图有一条难看的长长的黄线警告的。
即使你把代码改成这样:
也是没有什么卵用。
其实完全可以先把query.list()方法返回的东西,先存到一个存泛型的List<?>,之后,再读这个List的时候,再利用强制类型转换,将其转化为实体。之后再对这个实体进行操作。List<?>其实与List<Object>基本是没有区别的,但是List<?>却能够完美消除警告,List<Object>还是有警告。
import java.util.List; import org.hibernate.*; import org.hibernate.cfg.*; public class HibernateWarningTest { public static void main(String[] args) { Session session = new Configuration().configure().buildSessionFactory().openSession(); List<?> usertableList=session.createQuery("from Usertable").list(); for(int i=0;i<usertableList.size();i++){ Usertable usertable=(Usertable)usertableList.get(i); System.out.println(usertable.getId()+","+usertable.getUsername()+","+usertable.getPassword()); } session.close(); } }