【问题标题】:ResultTransformer in Hibernate return nullHibernate 中的 ResultTransformer 返回 null
【发布时间】:2011-09-19 10:02:23
【问题描述】:

我正在使用 ResultTransformer 仅从实体中选择特定属性,只是我不需要实体中的所有属性。 但我面临的问题是当一个属性是“一对多”时。 这是一个简单的例子。

@Entity
@Table(name = "STUDENT")
public class Student
{

private long studentId;
private String studentName;
private List<Phone> studentPhoneNumbers = new ArrayList<Phone>();

@Id
@GeneratedValue
@Column(name = "STUDENT_ID")
public long getStudentId()
{
  return this.studentId;
}
@OneToMany(cascade = CascadeType.ALL)
@JoinTable(name = "STUDENT_PHONE", joinColumns = {@JoinColumn(name = "STUDENT_ID")}, inverseJoinColumns = {@JoinColumn(name = "PHONE_ID")})
public List<Phone> getStudentPhoneNumbers()
{
  return this.studentPhoneNumbers;
}
@Column(name = "STUDENT_NAME", nullable = false, length = 100)
public String getStudentName()
{
  return this.studentName;
}

这是 ResultTransformer 用于存储所选属性的类。

public class StudentDTO
{
private long m_studentId;
private List<Phone> m_studentPhoneNumbers = new ArrayList<Phone>();
.. 
constructors and getters and setters..

最后是标准代码

 Criteria criteria = session.createCriteria(Student.class)
    .setProjection(Projections.projectionList()
      .add(Projections.property("studentId"), "m_studentId")
      .add(Projections.property("studentPhoneNumbers"), "m_studentPhoneNumbers"))
    .setResultTransformer(Transformers.aliasToBean(StudentDTO.class));


  List list = criteria.list();
  StudentDTO p = (StudentDTO) list.get(0);

所以,在我得到 StudentDTO 对象后,只有 studenId 可用,studentPhoneNumber 为 null .. 这是否意味着 ResultTransformer 不适用于任何关系?或者我的方式是错误的 有什么建议吗?

谢谢

【问题讨论】:

  • 看起来您的属性名称是正确的等等。您是否检查了正在运行的 SQL 以确保 phoneNumber 字段被正确分配?您是否还尝试过调试 AliasToBeanResultTransformer#transformTuple() 方法以确保在 DTO 上设置一个值?
  • 那是什么? AliasToBeanResultTransformer#transformTuple()。我会谷歌它并检查它是否对我有用。谢谢亚历克斯。
  • AliasToBeanResultTransformer 是 Transformer 上 aliasToBean 方法返回的内容。转换元组是执行域类到 DTO 的转换。即,它会在您的 DTO 上找到合适的设置器,并从查询对象数组中的别名字段中设置它们!这就解释了为什么它不适用于您的映射集合!它只能访问正在加载的域实体的结果集,而不是用于填充映射集合的结果集。
  • 好的,我在代码中添加了这一行: .setResultTransformer(new AliasToBeanResultTransformer(StudentDTO.class));但是结果中为 null 的属性不应该有任何异常吗?
  • 您不需要进行该更改,因为无论如何它就是这样做的。我不认为这会起作用,因为如果您查看 transformTuple 方法可以访问它的对象 [] 和包含查询结果及其别名的 String[] 。您无权访问 Phone 实例的集合,因此无法在您的 DTO 上设置它们。

标签: java hibernate criteria resulttransformer


【解决方案1】:

我以前遇到过这个问题。休眠中的转换器通常会导致挫败感。您可以按照建议进行手动分配,也可以使用 hibernate 将 DTO 类映射到同一个表。只需在 StudentDTO 类中添加与 Student 类相同的注释,然后像往常一样加载它。所以学生 DTO 将是:

@Entity
@Table(name = "STUDENT")

public class StudentDTO
{

private long studentId;
private String studentName;
private List<Phone> studentPhoneNumbers = new ArrayList<Phone>();

@Id
@GeneratedValue
@Column(name = "STUDENT_ID")
public long getStudentId()
{
  return this.studentId;
}
@OneToMany(cascade = CascadeType.ALL)
@JoinTable(name = "STUDENT_PHONE", joinColumns = {@JoinColumn(name = "STUDENT_ID")}, inverseJoinColumns = {@JoinColumn(name = "PHONE_ID")})
public List<Phone> getStudentPhoneNumbers()
{
  return this.studentPhoneNumbers;
}

只留下你不想加载的内容。

【讨论】:

  • 如果你注释 DTO 那么它不是 DTO :P
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-25
  • 2016-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-06
  • 2016-10-24
相关资源
最近更新 更多