デフォルトのTransformerを使用した場合、クラスは休止状態のエンティティであると想定されます。つまり、何らかのテーブルにマップする必要があり、2番目のケースでは次のようになります。
Query query=session.createQuery(hql.toString()).setResultTransformer(Transformers.aliasToBean(B.class));
Bは休止状態のエンティティではありません(休止状態の特定の注釈のない単純なPOJOのテーブルにマップされていません)
たとえば、クラスがある場合、クエリから返されたデータに従ってデータを入力したいと思います。クラスは単純なPOJOであり、Hibernateエンティティではないため、Hibernateはこのクラスを認識しません。これは、Transformersを使用してHibernateで実行できます。トランスフォーマーの使用方法を示す簡単な例を見てみましょう。まず、「UserActivityStat」という名前の単純なPOJOクラスを見てみましょう。このクラスには、いくつかの統計情報が含まれています。Hibernate HQLの実行から直接、インスタンスの統計情報を入力したいと思います。
public static class UserActivityStat{
private int totalPhotos;
private int totalViews;
public UserActivityStat() { }
public int getTotalPhotos() {
return totalPhotos;
}
public void setTotalPhotos(int totalPhotos) {
this.totalPhotos = totalPhotos;
}
public int getTotalViews() {
return totalViews;
}
public void setTotalViews(int totalViews) {
this.totalViews = totalViews;
}
}
次に、休止状態のHQLとTransformersクラスを使用して「UserActivityStat」インスタンスにデータを入力する簡単なメソッドを見てみましょう。
public UserActivityStat getUserActivityStat(User user) {
return (UserActivityStat) hibernateSession.createQuery(
"select count(*) as totalPhotos, sum(p.views) as totalViews " +
"from Photo p " +
"where p.user = :user " +
"p.dateCreated <= :now")
.setParameter("user", user)
.setTimestamp("now", new Date())
.setResultTransformer(Transformers.aliasToBean(UserActivityStat.class))
.uniqueResult();
}
2つの列のそれぞれにエイリアスがあることに注意してください。このエイリアスは、「UserActivityStat」クラスのプロパティの名前である必要があります。また、「Transformers」クラスに沿った「setResultTransformer」の使用にも注意してください。