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 变量。

  1. WorkoutDAOImpl class 中创建一个无参数构造函数并调用超级 Class 构造函数,即 BasicDAOImpl如下:
public class WorkoutDAOImpl extends BasicDAOImpl implements WorkoutDAO {
      WorkoutDAOImpl(){
       super(Workout.class);
      }

    }

虽然,你也可以使用反射来解决它。但是,按照您想要的方式,您必须显式调用 BasicDAOImpl 的构造函数。