私は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はどんな関係では動作しないということですか?または私の方法は間違っている 任意の提案?
ありがとうございました
プロパティ名が正しいかのようです。電話番号フィールドが正しく設定されていることを確認するために実行されているSQLを調べましたか?また、AliasToBeanResultTransformer#transformTuple()メソッドのデバッグを試して、DTOに設定する値があることを確認しましたか? –
これは何ですか? AliasToBeanResultTransformer#transformTuple()。私はそれをgoogleにして、それが私に役立つかどうかをチェックする。ありがとうアレックス。 – brakebg
AliasToBeanResultTransformerは、TransformersのaliasToBeanメソッドによって返されるものです。変換タプルは、ドメインクラスのDTOへの変換を実行するものです。つまり、DTO上に適切なセッターを見つけて、クエリオブジェクト配列のalisedフィールドから設定します。マップされたコレクションではうまくいかない理由を説明します。マッピングされたコレクションを生成するために使用される結果セットではなく、ロードされるドメインエンティティの結果セットにのみアクセスできます。 –