Hibernate による O/R マッピング(その 6)

Criteria による問い合わせ

HQL による問い合わせは、オブジェクト指向の中に問い合わせ言語の考えを持ち込むことになるので、その点では従前の SQL を用いる方法とあまり変わりがありません。そこで Hibernate には Criteria という、もう一つの問い合わせのための API が用意されています。実はこれ、全件取得のときにさりげなく使っていたのですが、そのときは条件を付け加えなかったので全件取得になっただけで、条件を付け加えればそれにしたがって問い合わせを行ってくれます。

package jp.mydns.akanekodou.dao;

import org.hibernate.Session;
import org.hibernate.Criteria;
import org.hibernate.criterion.Restrictions;

import java.util.List;

import jp.mydns.akanekodou.model.Product;

public class ProductDAO {
    private Session session;

    public ProductDAO() {
        session = DaoUtil.getSessionFactory().openSession();
    }

    public List<Product> like(String keyword) {
        Criteria cr =
            session
                .createCriteria(Product.class)
                .add(Restrictions.like("name", "%" + keyword.replace("%", "\\%").replace("_", "\\_") + "%"));
        @SuppressWarnings("unchecked")
        List<Product> result = cr.list();

        return result;
    }
}

HQL とどちらが良いのか、という問題にもなりそうですが、HQL の場合は先日も紹介したように書き方一つでインジェクションが起こり得ること、問い合わせの条件を Java のオブジェクトとして扱えることを考えると、私は Criteria を推します。*1

*1:ただし、単純な問い合わせなら、です。結合が絡むような複雑な問い合わせには Criteria は向かないですし、そうなってくると HQL で書いた方が早いことの方が多いです。