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

13

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

问题在于,在for循环中当我获取投影的id和name时,它获取默认值id=0和name=null,而不是数据库中原始实体记录的id=7和name="Name 8"。您知道这个问题是什么原因吗? for循环在最后的代码中。

这是学生实体(Student Entity)

@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<Course> courses;

    public Student() {
        this.courses = new HashSet<Course>();
    }

    // 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<StudentModel> students = criteria.list();

        for (StudentModel student : students) {
            System.out.println(student.getId());
            System.out.println(student.getName());
        }

        session.getTransaction().commit();
        session.close();
    }
2个回答

22

你可能只是忘记给你的投影分配别名了:

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

2
当属性名称相同时,为什么我们需要指定别名? - RamValli

4
此外,针对 @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查询。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接