0

ある条件に基づいてHibernateを使用してデータベーステーブルの行数をカウントする必要があるとするとorg.hibernate.criteria、次のように使用できます。

@Service
@Transactional(readOnly = true, propagation=Propagation.REQUIRES_NEW)
public final class StateDAO implements StateService
{
    private SessionFactory sessionFactory;

    public void setSessionFactory(SessionFactory sessionFactory)
    {
        this.sessionFactory = sessionFactory;
    }

    @Override
    @SuppressWarnings("unchecked")
    public Object rowCount(String id)
    {
        return sessionFactory.getCurrentSession()
              .createCriteria(State.class)
              .setProjection(Projections.rowCount())
              .add(Restrictions.eq("countryId", Long.parseLong(id)))
              .uniqueResult();
    }
}

idSpring経由で提供されているものに基づいて行数をカウントします。

これは、のようなHQLクエリを使用して実現することもできます。

sessionFactory.getCurrentSession()
              .createQuery("select count(*) as cnt from State where countryId=:id")
              .setParameter("id", Long.valueOf(id).longValue())
              .uniqueResult();

(パフォーマンスやその他の点で)どちらが優れていて通常ですか?

4

1 に答える 1

2

あなたの場合、それは好みの問題です。Criteria APIはタイプセーフであり、おそらくより高速です(HQLの解析の代償を払う必要はありません)。一方、HQLは、特にSQLのバックグラウンドを持つ人々にとっては読みやすいかもしれません。

条件APIを使用する必要がある唯一の場所は、クエリが動的である場合です。たとえば、入力に基づいて、WHERE条件のサブセットを選択できます。HQLを使用する場合は、文字列からHQLを構築するか(見栄えが悪い)、わずかに異なるコインごとのクエリを指数関数的に増やす必要があります。

于 2013-01-31T21:07:05.457 に答える