0

私はHibernateが初めてで、次のようなHQLクエリを返そうとしています:

    select u.user, up.name from Usuario  u
    join u.usuarioPersonals as up
    where u.idusuario=1

この結果を Dao で復元し、コンソールに表示した後

    List d =  usuarioDao.test(1);

    Iterator ite = d.iterator();

    while ( ite.hasNext() ) {
          Object[] row = (Object[]) ite.next();
          System.out.print("\t\t"+row[0]);
          System.out.print("\t"+row[1]);
          System.out.println();
    }

私の質問は、 Usuario.getUser() UsuarioPersonals.getName() のようなデータオブジェクトを取得する他のオプションはありませんか?

他のオプションは、次のように私のhql文を書くだけです:

    from Usuario  u
    join u.usuarioPersonals as up
    where u.idusuario=1

そして、私のデータを繰り返します

    while ( ite.hasNext() ) {
       Object[] row = (Object[]) ite.next();
   Usuario usr = (Usuario) row[0];
       UsuarioPersonals usr = (UsuarioPersonals) row[1];
       System.out.print(usr.getUser());
       System.out.print(usr.getName());
    }

サーブレットを介してビューに送信する場合、最後のオプションはおそらく複雑です。

申し訳ありませんが、私はこのテクノロジーに不慣れで、他のオプションを探していますが、データを送信するためにこの 2 つのオプションしか存在しない可能性があります。

ありがとう!

4

1 に答える 1

1

通常、結合を指定する必要はありません。

 from Usuario  u
 where u.idusuario=1

これにより、Usuario オブジェクトのリストが返され、オブジェクト グラフをトラバースして、その上にあるものを取得できます。

生成されている SQL を見ると、UsuarioPersonals がそこにないことがわかります。何が起こっているのかというと、アクセスしようとすると Hibernate が SQL を生成しようとしています。小さなアプリケーションではこれで問題はありませんが、最適化しようとしており、常にそれらのオブジェクトにアクセスすることがわかっている場合は、現在行っている方法と同様のクエリを作成できます。

from Usuario  u
    join fetch u.usuarioPersonals as up
    where u.idusuario=1

これにより、オブジェクトに UsuarioPersonals データが配置されるため、追加のデータベース呼び出しは必要ありません。繰り返しますが、おそらく必要ではなく、通常はルート オブジェクトを選択するだけでかまいません。

于 2013-10-10T06:53:08.043 に答える