3

エンティティから特定のプロパティのみを選択するために ResultTransformer を使用していますが、エンティティのすべてのプロパティは必要ありません。しかし、私が直面した問題は、プロパティが「1対多」の場合です。簡単な例を次に示します。

@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 はどの関係でも機能しないということですか? または私のやり方が間違っています 何か提案はありますか?

ありがとう

4

1 に答える 1

2

私は以前にこの問題に遭遇しました。通常、休止状態のトランスフォーマーはフラストレーションを引き起こします。提案されているように手動で割り当てを行うか、休止状態を使用して 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;
}

ロードしたくないものは除外してください。

于 2011-08-12T15:27:49.950 に答える