Come contiamo le righe usando le versioni precedenti di Hibernate (~ 2009)?


242

Ad esempio, se abbiamo un tavolo Libri, come conteremmo il numero totale di record di libri con l'ibernazione?

Risposte:


310

Per le versioni precedenti di Hibernate (<5.2):

Supponendo che il nome della classe sia Libro:

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

È almeno un Number, molto probabilmente un Long.


10
Restituisce a lungo.
dj_segfault,

10
Come suggerisce @Salandur, "È almeno un numero" e il tipo Numero ha i metodi "intValue ()", "longValue ()", in modo da poter ottenere facilmente il tipo primitivo desiderato che vogliamo: ((Number) criteri.uniqueResult ()). intValue ()
Jerry Tian,

5
Se non è possibile trovare il mapping delle entità utilizzando un parametro stringa per il metodo di creazione dei criteri, è possibile utilizzare anche session.createCriteria (Book.class)
Tobias M

5
Come ha detto @MontyBongo, in realtà ho dovuto fare riferimento alla classe in questo modo: return (Number) session.createCriteria(Book.class).setProjection(Projections.rowCount()).uniqueResult();
bcmoney

2
Quindi non dovresti usare un database razionale;). Il valore massimo di long è 9,223372037 × 10¹⁸, ovvero laaaaaaaaaarge
Salandur,

102

In Java di solito ho bisogno di restituire int e utilizzare questo modulo:

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

1
La risposta accettata per questa domanda non ha funzionato per me, ma la tua ha fatto. Grazie!
Jason Nichols, il

è questo il modo più rapido ed economico per ottenere il conteggio di una query? intendo il letargo
kommradHomer il

57
Qual è il punto di usare un ORM se finiamo comunque per codificare SQL?
thermz,

Questa è la mia preoccupazione principale (usare SQL anziché HQL). Devo usare SELECT nidificato solo per contare il numero di righe che seguono il join esterno sinistro (non ho trovato la corretta implementazione del join esterno sinistro in ibernazione).
Pramod,

15
Prima di tutto, questa soluzione non utilizza SQL, è HQL. E l'utilizzo di count (*) invece di 'select count (e) from E e' o criteri funziona con @EmbeddedId e database che non supportano il conteggio delle tuple (es. MySQL, dove query come 'select count ((a, b) ) dalla tabella 1 "non funziona).
BrunoJCM,

43

Ecco cosa ci dicono i documenti ufficiali di ibernazione su questo:

Puoi contare il numero di risultati della query senza restituirli:

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

Tuttavia, non restituisce sempre Integeristanza, quindi è meglio utilizzarlo java.lang.Numberper sicurezza.


1
+1 per una risposta che fornisce il metodo raccomandato dal team Hibernate.
Tom,

3
Per me questo ha dato "java.lang.ClassCastException: java.lang.Long non può essere lanciato su java.lang.Integer" ma il casting su un Long invece funziona ...
rogerdpack

2
@rogerdpack questo perché Hibernate ha cambiato il tipo restituito in 3.5 in Long: community.jboss.org/wiki/HibernateCoreMigrationGuide35
macchinario

1
Il tipo restituito per la funzione di conteggio è disponibile in org.hibernate.dialect.function.StandardAnsiSqlAggregationFunctions.CountFunction( StandardBasicTypes.LONG )
Guillaume Husta

12

Potresti provare count(*)

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

Dove si Bookstrova il nome accanto a class- non la tabella nel database.


scusa ma non funziona con Java e Hibernate :( (ho sostituito int con Integer, come è in Java per il cast di tipo.)
artigiano

Dovrebbe funzionare - con Integer anziché int? Devi inserire il nome della classe nell'HQL, non il nome della tabella - è l'unica cosa che posso pensare che possa essere sbagliata
Jon Spokes

1
Credo che il post direttamente sotto questo sia più in linea con i principi fondamentali di Hibernate.
Matt Sidesinger,

per me non funziona con Java e Hibernate. cosa fare invece?
rParvathi,

6

Se si utilizza Hibernate 5+, la query verrà modificata come

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

O se hai bisogno di TypedQuery

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

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

Dovrebbe essere``` Long count = (Long) session.createQuery ("select count (1) from Book"). UniqueResult (); `` `migliorerà le prestazioni
rajadilipkolli,

1

Funziona in Hibernate 4 (testato).

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

Dove getCurrentSession () è:

@Autowired
private SessionFactory sessionFactory;


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

1

È molto semplice, basta eseguire la seguente query JPQL:

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

Il motivo per cui stiamo eseguendo il casting Numberè che alcuni database torneranno Longmentre altri torneranno BigInteger, quindi per motivi di portabilità è meglio eseguire il casting su un Numbere ottenere un into un long, a seconda di quante righe si prevede di essere conteggiate.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.