2011年11月11日金曜日

[hibernate][select]可変パラメータを含むHQLの発行

可変パラメータを含む検索を行いたい場合は、次のように記述する。
例えば「メールアドレスが一致しているユーザの情報を取得する」という場合、メールアドレスが可変パラメータとなる。
下記はサンプルコード。

// コンフィギュレーションを作成する
Configuration config = new Configuration().configure();

// セッションファクトリーを作成する
SessionFactory sessionFactory = config.buildSessionFactory();

// セッションを取得する
Session session = sessionFactory.openSession();

// メールアドレスによる検索を行う
List list = session.createQuery(
        "from SAMPLE_SERVICE_USER u" + " where u.mail = :mail")
        .setParameter("mail", "test@test.co.jp").list();

検索結果をエンティティのリストとして取得する場合、createQueryにselectは書かなくてよい。
fromの次は、@Entityアノテーションのname属性で指定した名前(データベースのテーブル名)を指定する。
SAMPLE_SERVICE_USERをuという別名にし、同テーブルの属性mailでwhereを記述している。

whereの箇所で出ている":mail"の部分が可変パラメータとなる。
setParameterの第1引数に"mail"と書くと、":mail"の箇所が"test@test.co.jp"に置き換わる。

クエリの戻り値はObjectの配列となっているため、整形が必要。

// 結果を整理し、適切な形で呼び出し側に戻す
List<SampleServiceUser> sampleServiceUserList = new ArrayList<SampleServiceUser>();
for (int i = 0; i < list.size(); i++) {
    Object[] item = (Object[]) list.get(i);
    for (int j = 0; j < item.length; j++) {
        if (item[j].getClass() == SampleServiceUser.class) {
            sampleServiceUserList.add((SampleServiceUser) item[j]);
        }
    }
}

サンプルを動作確認が取れれば成功。

0 件のコメント:

コメントを投稿