38

以下のようなクエリがあります

select f.id, s.name, ss.name
from first f
left join second s on f.id = s.id
left join second ss on f.sId = ss.id

HQL を使用できる場合は、HQL コンストラクター構文を使用して、DTO に結果セットを直接入力します。しかし、Hibernate では関連付けを行わないと左結合が許可されないため、ネイティブ SQL クエリを使用する必要があります。

現在、JDBC スタイルで結果セットをループし、DTO オブジェクトを設定しています。それを達成するためのより簡単な方法はありますか?

4

1 に答える 1

64

おそらく結果トランスフォーマーを使用できます。Hibernate 3.2 の引用: HQL および SQL 用のトランスフォーマー:

SQL トランスフォーマー

非エンティティ Bean または Map を返すネイティブ sql を使用すると、より便利なことがよくありObject[]ます。結果トランスフォーマーにより、それが可能になりました。

List resultWithAliasedBean = s.createSQLQuery(
  "SELECT st.name as studentName, co.description as courseDescription " +
  "FROM Enrolment e " +
  "INNER JOIN Student st on e.studentId=st.studentId " +
  "INNER JOIN Course co on e.courseCode=co.courseCode")
  .addScalar("studentName")
  .addScalar("courseDescription")
  .setResultTransformer( Transformers.aliasToBean(StudentDTO.class))
  .list();

StudentDTO dto =(StudentDTO) resultWithAliasedBean.get(0);

ヒント: addScalar()HSQLDB では、列名がすべて大文字で返されるため ("STUDENTNAME" など)、プロパティ名と一致させるために呼び出しが必要でした。これは、完全一致を使用する代わりにプロパティ名を検索するカスタム トランスフォーマーを使用して解決することもできます。おそらく fuzzyAliasToBean() メソッドを提供する必要があります ;)

参考文献

于 2010-10-14T20:58:29.163 に答える