Java - Hibernate criteria.setResultTransformer() 使用默认值初始化模型字段
Posted
技术标签:
【中文标题】Java - Hibernate criteria.setResultTransformer() 使用默认值初始化模型字段【英文标题】:Java - Hibernate criteria.setResultTransformer() initializes model fields with default values 【发布时间】:2013-11-06 20:51:19 【问题描述】:我是 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();
【问题讨论】:
【参考方案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”是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 查询。
【讨论】:
以上是关于Java - Hibernate criteria.setResultTransformer() 使用默认值初始化模型字段的主要内容,如果未能解决你的问题,请参考以下文章
Java - Hibernate criteria.setResultTransformer() 使用默认值初始化模型字段