当前位置: 首页 > 面试题库 >

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

管翼
2023-03-14
问题内容

我是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<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();
    }

问题答案:

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

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


 类似资料:
  • 考虑以下代码 VS2013编译器发出以下警告: 警告C4351:新行为:数组“B::member”的元素将默认初始化1 这里有记载 使用C 11,并应用“默认初始化”的概念,意味着B. part的元素将不会被初始化。 但我认为,成员{}应该执行值初始化,而不是默认初始化。VS2013编译器是否损坏? 8.5美元/6 默认初始化类型为T的对象意味着:-如果T是(可能是cv限定的)类类型(第9条),则

  • 根据我的参考,基元类型具有默认值,对象为null。我测试了一段代码。 行将是指向变量的错误,表示,而在给定引用中,将作为默认值。但是,使用下面给定的代码,它将实际打印。 第一个代码可能会出什么问题?类变量的行为是否与局部变量不同?

  • null 必需的 获取java对象(根元素),它完全表示xml和每个由默认值初始化的成员。 当我试图在不显式设置值的情况下marshall xml时,默认值并不能使sence...有什么方法可以在不自定义生成的类的情况下,用默认值填充xml吗? .xsd的示例: 和java类:

  • 问题内容: 如果未将显式值传递给方法,我想用一些默认值初始化方法的参数-像这样: 我得到了错误: 我该如何解决? 问题答案: 这里常见的习惯用法是将默认值设置为一些哨兵值用于此目的,这是典型值,然后您可以检查该值。 您可能还会看到用于哨兵的实例。 后一个版本的优点是可以传递给函数,但有一些缺点(请参见下面@larsmans的评论)。如果您不认为需要将有意义的参数传递给您的方法,那么我建议您使用它。

  • 问题内容: 考虑一个名为的Java字符串字段。为类x创建对象时的初始值是多少? 我知道对于变量,在创建实例时将默认值分配为。但是会变成什么呢? 问题答案: 如果不执行任何操作,则将其初始化为null,所有引用类型也将初始化为null。

  • 问题内容: 所以,应该是直截了当的问题。 可以说我有一堂课,其中包含很多字段,例如: 我怎样才能与反思,看是否领域,并已初始化或离开NULL,0和虚假的默认值吗? 问题答案: 您只有7种基本类型和一种引用类型要检查。如果将所有Number类型分组在一起,则只有四个要检查的值。