2011-06-21 13 views
3

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

@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はどんな関係では動作しないということですか?または私の方法は間違っている 任意の提案?

ありがとうございました

+0

プロパティ名が正しいかのようです。電話番号フィールドが正しく設定されていることを確認するために実行されているSQLを調べましたか?また、AliasToBeanResultTransformer#transformTuple()メソッドのデバッグを試して、DTOに設定する値があることを確認しましたか? –

+0

これは何ですか? AliasToBeanResultTransformer#transformTuple()。私はそれをgoogleにして、それが私に役立つかどうかをチェックする。ありがとうアレックス。 – brakebg

+0

AliasToBeanResultTransformerは、TransformersのaliasToBeanメソッドによって返されるものです。変換タプルは、ドメインクラスのDTOへの変換を実行するものです。つまり、DTO上に適切なセッターを見つけて、クエリオブジェクト配列のalisedフィールドから設定します。マップされたコレクションではうまくいかない理由を説明します。マッピングされたコレクションを生成するために使用される結果セットではなく、ロードされるドメインエンティティの結果セットにのみアクセスできます。 –

答えて

2

私は以前この問題に遭遇しました。休止状態の変圧器は一般的に不満を招く。提案されているように手動割り当てを行うこともできますし、hibernateを使用してDTOクラスを同じテーブルにマップすることもできます。同じ注釈をStudentクラスと同じようにStudentDTOクラスに追加してから、通常のように読み込みます。したがって、学生の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; 
} 

読み込みたくないものは除きます。

+3

DTOに注釈を付けると、そのDTOではない:P –