Hibernate'in eski sürümlerini (~ 2009) kullanarak satırları nasıl sayabiliriz?


242

Örneğin, Kitaplar tablonuz varsa, hazırda bekleme durumundaki toplam kitap kaydı sayısını nasıl hesaplayabiliriz?

Yanıtlar:


310

Hazırda Bekletme modunun eski sürümleri için (<5.2):

Sınıf adının Kitap olduğunu varsayarsak:

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

En azından bir Number, büyük olasılıkla bir Long.


10
Uzun döner.
dj_segfault

10
@Salandur'un önerdiği gibi, "En az bir Sayıdır" ve Sayı türü "intValue ()", "longValue ()" yöntemlerine sahiptir, böylece istediğimiz ilkel türü kolayca elde edebiliriz: ((Sayı) ölçütleri.uniqueResult intValue ()
Jerry Tian

5
Varlık eşleme, ölçüt oluşturma yöntemine bir dize parametresi kullanılarak bulunamazsa, session.createCriteria (Book.class) da kullanılabilir
Tobias M

5
@MontyBongo'nun dediği gibi, aslında şu şekilde sınıfa başvurmak zorunda kaldım: return (Number) session.createCriteria(Book.class).setProjection(Projections.rowCount()).uniqueResult();
bcmoney

2
O zaman rasyonel bir veritabanı kullanmamalısınız;). Maksimum uzun değeri 9.22272037 × 10¹⁸, laaaaaaaaaarge
Salandur

102

Java genellikle int dönmek ve bu formu kullanmanız gerekir:

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

1
Bu soru için kabul edilen cevap benim için işe yaramadı, ama seninki işe yaradı. Teşekkürler!
Jason Nichols

bu bir sorgunun sayısını elde etmenin en hızlı ve en ucuz yolu mu? Hibernate-Wise
KommradHomer

57
Yine de SQL kodlaması yaparsak ORM kullanmanın anlamı nedir?
thermz

Bu benim asıl endişem (HQL yerine SQL kullanmak). Sadece sol dış birleşimden sonra gelen satır sayısını saymak için iç içe SELECT kullanmak zorunda (Ben hazırda sol dış birleşim düzgün uygulama bulamadık).
Pramod

15
Öncelikle, bu çözüm SQL kullanmıyor, HQL. Ve 'E e'den count (e)' yi seçmek yerine count (*) veya ölçütler @EmbeddedId ve tuple sayısını desteklemeyen veritabanları (örn. MySQL gibi 'select count ((a, b) ) table1 'den çalışmıyor).
BrunoJCM

43

Resmi hazırda bekletme belgelerinin bize bu konuda söyledikleri :

Sorgu sonuçlarının sayısını döndürmeden sayabilirsiniz:

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

Ancak, her zaman Integerörnek döndürmez , bu nedenle java.lang.Numbergüvenlik için kullanmak daha iyidir .


1
Hazırda Bekleme ekibine önerilen yöntemi veren bir yanıt için +1.
Tom

3
Benim için bu "java.lang.ClassCastException: java.lang.Long java.lang.Integer" a
dökülemez

2
@rogerdpack bunun nedeni Hibernate'in döndürülen türü 3.5'te Long olarak değiştirmesidir: community.jboss.org/wiki/HibernateCoreMigrationGuide35
Makineler

1
Sayım işlevi için dönüş türü org.hibernate.dialect.function.StandardAnsiSqlAggregationFunctions.CountFunction( StandardBasicTypes.LONG )
Guillaume Husta

12

Deneyebilirsin count(*)

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

Nerede Bookskapalı adıdır classveritabanında değil tablo -.


üzgünüm ama Java ve Hibernate ile çalışmıyor :( (Ben int tipi tamsayı için Java ile olduğu gibi, Integer yerine yaptı.)
usta 9

Çalışmalı - int yerine Tamsayı ile? HQL içinde sınıf adını koymak gerekir, tablo adını değil - yanlış olduğunu düşünebileceğim tek şey
Jon Spokes

1
Bunun hemen altındaki yazının temel Hazırda Bekletme ilkelerine daha uygun olduğuna inanıyorum.
Matt Sidesinger

benim için java ve hazırda bekletme ile çalışmıyor. bunun yerine ne yapmalı?
rParvathi

6

Hibernate 5+ kullanıyorsanız, sorgu şu şekilde değiştirilecektir:

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

Veya TypedQuery'ye ihtiyacınız varsa

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

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

`` Uzun sayı = (Uzun) session.createQuery ("Kitaptan sayıyı (1) seçin") olmalıdır. UniqueResult (); `` performansı artıracak
rajadilipkolli

1

Bu, Hazırda Bekletme 4'te (Test Edildi) çalışır.

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

GetCurrentSession () nerede:

@Autowired
private SessionFactory sessionFactory;


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

1

Çok kolay, sadece aşağıdaki JPQL sorgusunu çalıştırın:

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

Biz vermek, yayın nedeni Numberbazı veritabanları dönecektir olmasıdır Longdiğerleri dönecektir ise BigIntegerbir çevrim daha iyi şekilde taşınabilirlik uğruna, Numberve bir alma intveya longsize sayılacak bekliyoruz kaç satır bağlı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.