Hibernate 的泛型什么时候必须使用条件?
Generics with Hibernate when should I have to use criteria?
我尝试在我的代码中使用泛型。
我有从 BD 获取信息的 Dao :
@Component
public class BasicDAOImpl<T> implements BasicDAO<T> {
private Class<T> type;
public BasicDAOImpl(Class<T> type) {this.type = type;
}
public BasicDAOImpl() {
}
@Autowired
SessionFactory sessionfactory;
@Override
@Transactional
public List<T> getAllByKey(int id) {
List<T> list = new ArrayList<>();
try{
Session session = sessionfactory.getCurrentSession();
Criteria criteria = session.createCriteria(type);
criteria.add(Restrictions.eq("parentid", id));
list.addAll(criteria.list());
}catch (HibernateException e){}
return list;
}
我有:
WorkoutDAOImpl extende BasicDAOImpl
public class WorkoutDAOImpl extends BasicDAOImpl<Workout> implements WorkoutDAO {}
豆子:
@Bean
public WorkoutDAO workoutDAO(){
return new WorkoutDAOImpl();
}
我在代码中写:
workoutDAO.getAllByKey(int 2)
并得到错误
java.lang.NullPointerException
在
Criteria criteria = session.createCriteria(type)
。
为什么?
如果写 Criteria criteria = session.createCriteria(Workout.class)
,则不会出现任何错误。
PS/ 对不起还是我的英语:)
Workout.class
未从您的 WorkoutDAOImpl
传递给 BasicDAOImpl
,因此 Class<T> type
未初始化,您得到 NullPointerException
。添加无参数构造函数:
public class WorkoutDAOImpl extends BasicDAOImpl<Workout> implements WorkoutDAO {
public WorkoutDAOImpl() {
super(Workout.class);
}
}
您需要调用 BasicDAOImpl class 的一个参数构造函数以设置初始化 type 变量。
- 在 WorkoutDAOImpl class 中创建一个无参数构造函数并调用超级 Class 构造函数,即 BasicDAOImpl如下:
public class WorkoutDAOImpl extends BasicDAOImpl implements WorkoutDAO {
WorkoutDAOImpl(){
super(Workout.class);
}
}
虽然,你也可以使用反射来解决它。但是,按照您想要的方式,您必须显式调用 BasicDAOImpl 的构造函数。
我尝试在我的代码中使用泛型。 我有从 BD 获取信息的 Dao :
@Component
public class BasicDAOImpl<T> implements BasicDAO<T> {
private Class<T> type;
public BasicDAOImpl(Class<T> type) {this.type = type;
}
public BasicDAOImpl() {
}
@Autowired
SessionFactory sessionfactory;
@Override
@Transactional
public List<T> getAllByKey(int id) {
List<T> list = new ArrayList<>();
try{
Session session = sessionfactory.getCurrentSession();
Criteria criteria = session.createCriteria(type);
criteria.add(Restrictions.eq("parentid", id));
list.addAll(criteria.list());
}catch (HibernateException e){}
return list;
}
我有: WorkoutDAOImpl extende BasicDAOImpl
public class WorkoutDAOImpl extends BasicDAOImpl<Workout> implements WorkoutDAO {}
豆子:
@Bean
public WorkoutDAO workoutDAO(){
return new WorkoutDAOImpl();
}
我在代码中写:
workoutDAO.getAllByKey(int 2)
并得到错误
java.lang.NullPointerException
在
Criteria criteria = session.createCriteria(type)
。
为什么?
如果写 Criteria criteria = session.createCriteria(Workout.class)
,则不会出现任何错误。
PS/ 对不起还是我的英语:)
Workout.class
未从您的 WorkoutDAOImpl
传递给 BasicDAOImpl
,因此 Class<T> type
未初始化,您得到 NullPointerException
。添加无参数构造函数:
public class WorkoutDAOImpl extends BasicDAOImpl<Workout> implements WorkoutDAO {
public WorkoutDAOImpl() {
super(Workout.class);
}
}
您需要调用 BasicDAOImpl class 的一个参数构造函数以设置初始化 type 变量。
- 在 WorkoutDAOImpl class 中创建一个无参数构造函数并调用超级 Class 构造函数,即 BasicDAOImpl如下:
public class WorkoutDAOImpl extends BasicDAOImpl implements WorkoutDAO { WorkoutDAOImpl(){ super(Workout.class); } }
虽然,你也可以使用反射来解决它。但是,按照您想要的方式,您必须显式调用 BasicDAOImpl 的构造函数。