HQL获取某个字段值时容易犯的错误
这是一个使用集合类泛型的例子:
如果要使用集合类的泛型,你安装的JDK必须是1.5或者更高版本。
需要记住一点:集合类的泛型不支持基本数据类型(int,long,float,double,char,byte,boolean,short)
比如,有个实体类Message,里面有个字段 orderNumber(排序号),当然,这个字段有setter和getter方法.
orderNumber:Integer 唯一
需要获取这个orderNumber的最大值。
先定义一个hql语句
String hql = "select max(m.orderNumber) from Message m where m.messageFlag=1";
List<E> list = this.getSession().getSessionFactory().openSession().createQuery(hql).list();
在这个List的泛型E里面,很多人会使用Message,如下:
List<Message> list = this.getSession().getSessionFactory().openSession().createQuery(hql).list();
然后做 Integer orderNumber = list.get(0).getOrderNumber();
list.get(0)表示返回一个泛型对象,在这里是Message。
如果执行这个操作,会报有一个异常:
java.lang.ClassCastException: java.lang.Integer can not pase to Message....
原因是:我们从hql语句中可以看出,如果执行这个语句,返回的应该是一个Integer类型。
但是我们在List<E>泛型里我们返回的是Message。
所以会出现了类型转换异常。
此时,泛型E应该是Integer,如下:
List<Integer> list = this.getSession().getSessionFactory().openSession().createQuery(hql).list();
Integer orderNumber = list.get(0);
此时,就可以成功的返回最大值了。
同理,如果要返回的字段是String,那么泛型E应该是String .
其他字段类似。