Java – Hibernate criteria.setResultTransformer()使用默认值初始化模型字段

我是Hibernate的新手,我正试图从数据库中获取一些数据。 我不想获得完整的数据,而是实体的投影。

问题是在for循环中,当我得到我的投影的id和名称时,它得到默认值id = 0和name = null而不是id = 7和name =“Name 8”这是记录的数据库中的原始实体。 你知道导致这个问题的原因吗? for循环在最后一个代码中。

这是学生实体

@Entity(name = "Students") public class Student { @Id @GeneratedValue @Column(name = "StudentId") private int id; @Column(name = "Name", nullable = false, length = 50) private String name; @Column(name = "Grade") private Double grade = null; @ManyToOne(cascade = CascadeType.PERSIST) @JoinColumn(name = "FacultyId", nullable = false) private Faculty faculty; @ManyToMany(cascade = CascadeType.PERSIST) @JoinTable( joinColumns = @JoinColumn(name = "StudentId"), inverseJoinColumns = @JoinColumn(name = "CourseId")) private Collection courses; public Student() { this.courses = new HashSet(); } // Setters and Getters for all fields } 

这是StudentModel

 public class StudentModel { private int id; private String name; public int getId() { return this.id; } public void setId(int id) { this.id = id; } public String getName() { return this.name; } public void setName(String name) { this.name = name; } } 

我正在执行的代码

 Session session = sessionFactory.openSession(); session.beginTransaction(); { Criteria criteria = session.createCriteria(Student.class); criteria.add(Restrictions.eq("name", "Name 8")) .setProjection( Projections.projectionList() .add(Projections.property("id")) .add(Projections.property("name"))) .setResultTransformer( Transformers.aliasToBean(StudentModel.class)); @SuppressWarnings("unchecked") List students = criteria.list(); for (StudentModel student : students) { System.out.println(student.getId()); System.out.println(student.getName()); } session.getTransaction().commit(); session.close(); } 

您可能只是忘了为投影分配别名:

 Projections.projectionList() .add(Projections.property("id"), "id") .add(Projections.property("name"), "name") 

另外还要回复@Ram评论:

 Projections.projectionList() .add(Projections.property("id"), "id") .add(Projections.property("name"), "name") 

“id”和“name”是您的Student类中的Java字段名称,但在您的数据库中它们被命名为“StudentId”和“Name”,而且hibernate生成带有随机别名的SQL查询以避免名称冲突,因此在结果集中有不是“id”和“name”列。 上例中的第二个参数强制别名。

Hibernate生成SQL,如下所示:

 SELECT students0_.StudientId as StudientId12, students0_.Name as Name34, students0_.Grade as Grade11 FROM Students students0_ 

您可以通过在Hibernate配置文件hibernate.cfg.xml中将hibernate.show_sql设置为true来告诉hibernate在控制台/日志中显示生成的SQL查询。