1

Hibernateの実装メカニズムをどこで見つけることができるかわかりません。Hibernateについて多くの質問がありますが、これから始めることができます。

このようなHQLがある場合:

from B b
where b.x =: x
and b.y =: y

そして、次のようなコードをクエリします。

Query query = session.createQuery(hql.toString());

すべてのフィールドをBに設定するためのデフォルトのトランスフォーマーは何ですか?値を設定するのにセッターやゲッターも必要ないことがわかりました。

または、これとこれとの違いは何ですか?

Query query = session.createQuery(hql.toString()).setResultTransformer(Transformers.aliasToBean(B.class));

これを読んでいただきありがとうございます。どんなアイデアでも大歓迎です。

4

1 に答える 1

9

デフォルトの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」の使用にも注意してください。

于 2012-12-14T06:02:21.800 に答える