ResultTransformer в Hibernate возвращает ноль - PullRequest
3 голосов
/ 21 июня 2011

Я использую 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 равен нулю. Означает ли это, что ResultTransformer не работает с какими-либо отношениями?или мой путь не верен Есть предложения?

Спасибо

1 Ответ

2 голосов
/ 12 августа 2011

Я сталкивался с этой проблемой раньше. Трансформаторы в спящем режиме обычно приводят к разочарованию. Вы можете сделать ручное назначение, как это предлагается, или вы можете сопоставить класс DTO с той же таблицей, используя hibernate. Просто добавьте ту же аннотацию к вашему классу 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;
}

Просто опустите то, что вы не хотите загружать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...