web-dev-qa-db-ja.com

古いバージョンのHibernate(〜2009)を使用して行を数える方法は?

たとえば、テーブルBooksがある場合、Hibernateでブックレコードの総数をどのようにカウントするのでしょうか。

239
craftsman

Hibernateの古いバージョン(<5.2)の場合:

クラス名をBookとします。

return (Number) session.createCriteria("Book")
                  .setProjection(Projections.rowCount())
                  .uniqueResult();

少なくともNumber、おそらくLongです。

309
Salandur

Javaでは、通常intを返して次の形式を使う必要があります。

int count = ((Long)getSession().createQuery("select count(*) from Book").uniqueResult()).intValue();
102
marioosh

これが何なのか 公式の休止状態文書は教えてくれます これについて私たちは:

結果を返さずにクエリ結果の数を数えることができます。

( (Integer) session.createQuery("select count(*) from ....").iterate().next() ).intValue()

しかし、必ずしもIntegerインスタンスを返すわけではないので、安全のためにJava.lang.Numberを使用することをお勧めします。

43
Antonio

あなたはcount(*)を試すことができます

Integer count = (Integer) session.createQuery("select count(*) from Books").uniqueResult();

Booksclass以外の名前です。データベース内のテーブルではありません。

12
Jon Spokes
Long count = (Long) session.createQuery("select count(*) from  Book").uniqueResult();
6
xrcwrn

Hibernate 5+を使用している場合、クエリは次のように変更されます。

Long count = session.createQuery("select count(1) from  Book")
                    .getSingleResult();

TypedQueryが必要な場合

Long count = session.createQuery("select count(1) from  Book",Long.class)
                        .getSingleResult();
6
rajadilipkolli

非常に簡単です。次のJPQLクエリを実行するだけです。

int count = (
(Number)
    entityManager
    .createQuery(
        "select count(b) " +
        "from Book b")
    .getSingleResult()
).intValue();

Numberにキャストする理由は、一部のデータベースがLongを返す一方で、他のデータベースはBigIntegerを返すため、移植性のためにNumberにキャストして取得することをお勧めしますカウントが予想される行数に応じて、intまたはlong

1
Vlad Mihalcea

これはHibernate 4(テスト済み)で動作します。

String hql="select count(*) from  Book";
Query query= getCurrentSession().createQuery(hql);
Long count=(Long) query.uniqueResult();
return count;

GetCurrentSession()は次のとおりです。

@Autowired
private SessionFactory sessionFactory;


private Session getCurrentSession(){
return sessionFactory.getCurrentSession();
}
1
LucianoDemuru