古いバージョンのHibernate(〜2009)を使用して行をカウントするにはどうすればよいですか?


242

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

回答:


310

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

クラス名がBookであると仮定します。

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

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


10
ロングを返します。
dj_segfault

10
@Salandurが示唆するように、「それは少なくとも数値」であり、数値タイプには「intValue()」、「longValue()」メソッドがあるため、必要なプリミティブタイプを簡単に取得できます:((Number)criteria.uniqueResult ())。intValue()
ジェリーティアン

5
作成条件メソッドへの文字列パラメーターを使用してエンティティマッピングが見つからない場合は、session.createCriteria(Book.class)も使用できます
Tobias M

5
@MontyBongoが言ったように、私は実際にこのようなクラスを参照する必要がありました: return (Number) session.createCriteria(Book.class).setProjection(Projections.rowCount()).uniqueResult();
bcmoney

2
次に、合理的なデータベースを使用しないでください;)。longの最大値は9,223372037×10¹⁸で、これはlaaaaaaaaaargeです
Salandur

102

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

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

1
この質問に対する受け入れられた答えは私にはうまくいきませんでしたが、あなたの答えはうまくいきました。ありがとう!
Jason Nichols

これはクエリのカウントを取得するための最も速くて最も安い方法ですか?私は休止状態を意味します
kommradHomer 2012年

57
とにかくSQLをコーディングする場合、ORMを使用する意味は何ですか?
thermz 2012

それが私の最大の関心事です(HQLの代わりにSQLを使用)。左外部結合の後に来る行の数をカウントするためだけにネストされたSELECTを使用する必要があります(休止状態での左外部結合の適切な実装が見つかりませんでした)。
Pramod 2012

15
まず、このソリューションはSQLを使用せず、HQLです。また、「select count(e)from E e」または条件の代わりにcount(*)を使用すると、@ EmbeddedIdおよびタプルカウントをサポートしないデータベース(例:MySQL、 'select count((a、b) )from table1 'は機能しません)。
BrunoJCM 2012

43

これは公式の休止状態のドキュメントがこれについて私たちに言っているものです:

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

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

ただし、常にIntegerインスタンスを返すとは限らないjava.lang.Numberため、安全のために使用することをお勧めします。


1
Hibernateチームが推奨する方法を提供する回答の+1。
トム

3
私にとってこれは「java.lang.ClassCastException:java.lang.Longはjava.lang.Integerにキャストできません」を与えましたが、代わりにLongへのキャストは機能します...
rogerdpack

2
:これはHibernateはロングに3.5で返さ種類を変更したためである@rogerdpack community.jboss.org/wiki/HibernateCoreMigrationGuide35
機械

1
count関数の戻り値の型は、org.hibernate.dialect.function.StandardAnsiSqlAggregationFunctions.CountFunctionStandardBasicTypes.LONG
Guillaume Husta

12

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

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

データベース内のテーブルではなくBooks、名前がどこにあるのかclass


申し訳ありませんが、JavaおよびHibernateでは機能しません:((Javaでは型キャストのため、intをIntegerで置き換えました。)
craftsman

それは動作するはずです-intの代わりにIntegerで?テーブル名ではなく、クラス名をHQLに入れる必要があります-私が間違っていると思う唯一のことです
Jon Spokes

1
この直下の投稿は、Hibernateのコア原則に沿っていると思います。
Matt Sidesinger

私にとっては、javaとhibernateでは動作しません。代わりに何をしますか?
rParvathi 2016

6

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
Long count = (Long) session.createQuery("select count(*) from  Book").uniqueResult();

`` `Long count =(Long)session.createQuery(" select count(1)from Book ")。uniqueResult();` ``である必要があります
rajadilipkolli

1

これは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

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.