Подтвердить что ты не робот

Java - Hibernate criteria.setResultTransformer() инициализирует поля модели со значениями по умолчанию

Я новичок в Hibernate, и я пытаюсь получить некоторые данные из базы данных. Я не хочу получать полные данные, кроме проекции объекта.

Дело в том, что в цикле for, когда я получаю идентификатор и имя моей проекции, он получает значения по умолчанию 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<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();
    }
4b9b3361

Ответ 1

Вероятно, вы просто забыли назначить псевдонимы для своих прогнозов:

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

Ответ 2

Кроме того, чтобы ответить на комментарий @Ram:

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

"id" и "name" - это имя поля Java в вашем классе Student, но в вашей базе данных они называются "StudentId" и "Name", кроме того, спящий генератор генерирует SQL-запрос со случайным псевдонимом, чтобы избежать конфликта имен, поэтому в результате в наборе нет столбца "id" и "name". Второй параметр в приведенном выше примере заставляет имя псевдонима.

Hibernate генерирует SQL следующим образом:

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

Вы можете сказать, что спящий режим отображает сгенерированный SQL-запрос в консоли/журнале, установив hibernate.show_sql в true в конфигурационном файле Hibernate hibernate.cfg.xml.