做好了一个简单的网页,准备进行Dao的优化。写了一个BaseDao类将通用的Dao方法抽取出来成为父类。然而一直有个问题卡了我两个小时,百思不得其解。
代码如下:
被抽取的Dao的方法:
public List<Employee> getAll() {
return sessionFactory.getCurrentSession().createQuery("from Employee").list();
}
抽取出来的Dao父类的方法:
public List<T> getAll() {
return sessionFactory.getCurrentSession().createQuery("from "+className).list();
}
实现原理很简单,就是通过:
// 反射泛型
public BaseDao() {
Type type = this.getClass().getGenericSuperclass();
// 转换为参数化类型
ParameterizedType pt = (ParameterizedType) type;
// 得到实际类型
Type types[] = pt.getActualTypeArguments();
// 获取实际类型
clazz = (Class<T>) types[0];
className = clazz.getSimpleName();
}
奇怪的是没抽取前能运行,抽取后无法运行了。琢磨了一个多小时,发现问题就是抽取后 ("from"+className). 这句话有问题,因为HQL语句要通过类名来查找对应的Bean和配置信息,而这个 抽取后得到的HQL语句是——fromclassName. 抽取前是 from className ,中间差了一个空格,所以无法识别,希望大家引以为戒,别粗心大意的差个空格浪费一大堆时间。