たとえば、テーブルBooksがある場合、Hibernateでブックレコードの総数をどのようにカウントするのでしょうか。
Hibernateの古いバージョン(<5.2)の場合:
クラス名をBookとします。
return (Number) session.createCriteria("Book")
.setProjection(Projections.rowCount())
.uniqueResult();
少なくともNumber
、おそらくLong
です。
Javaでは、通常intを返して次の形式を使う必要があります。
int count = ((Long)getSession().createQuery("select count(*) from Book").uniqueResult()).intValue();
これが何なのか 公式の休止状態文書は教えてくれます これについて私たちは:
結果を返さずにクエリ結果の数を数えることができます。
( (Integer) session.createQuery("select count(*) from ....").iterate().next() ).intValue()
しかし、必ずしもInteger
インスタンスを返すわけではないので、安全のためにJava.lang.Number
を使用することをお勧めします。
あなたはcount(*)
を試すことができます
Integer count = (Integer) session.createQuery("select count(*) from Books").uniqueResult();
Books
はclass
以外の名前です。データベース内のテーブルではありません。
Long count = (Long) session.createQuery("select count(*) from Book").uniqueResult();
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();
非常に簡単です。次のJPQLクエリを実行するだけです。
int count = (
(Number)
entityManager
.createQuery(
"select count(b) " +
"from Book b")
.getSingleResult()
).intValue();
Number
にキャストする理由は、一部のデータベースがLong
を返す一方で、他のデータベースはBigInteger
を返すため、移植性のためにNumber
にキャストして取得することをお勧めしますカウントが予想される行数に応じて、int
またはlong
。
これは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();
}