2016-05-03 7 views
1

Ich schrieb den folgenden Code die Anzahl der "ExampleEntity" zu erhalten:Wie generieren "select count (*) ..." mit CriteriaQuery

cb = entityManager.getCriteriaBuilder(); 
CriteriaQuery<Long> cq = cb.createQuery(Long.class); 
root = cq.from(ExampleEntity); 
cq.select(cb.count(root)); 
return entityManager.createQuery(cq).getSingleResult(); 

generierten SQL: Hibernate: wählen count (exampleen0_.id) als col_0_0_ von EXAMPLEENTITY

exampleen0_

aber aus Leistungsgründen (eine Oracle 11g-Datenbank), muss ich die folgende sQL generieren:

Wunsch sql: select count (*) als col_0_0_ von EXAMPLEENTITY exampleen0_

Es ist ganz einfach JPQL Abfragen zu tun zu schaffen, aber ich würde viel vorhandenen Code für Filter neu zu schreiben hat.

Wie kann ich "count (*)" anstelle von "count (examplen0_.id)" mithilfe von CriteriaQuery generieren?

Antwort

0

Es ist extrem schwierig, die Hand des von Hibernate erzeugten SQL zu erzwingen. Stattdessen würde ich eine native Abfrage schreiben.

Query query = entityManager.createNativeQuery(
     "SELECT COUNT(*) FROM EXAMPLEENTITY", Long.class); 
return query.getSingleResult(); 

Hinweis: india Abfragen können chaotisch, wenn komplexere Logik, aber dies insbesondere ein entspricht der Norm ANSI und sollte ohne Probleme gegen eine häufig verwendete DB laufen, ohne jede db-spezifische Sorgen Syntaxprobleme.

+0

Richtig, es ist eine Alternative, wie die JPQL Abfragen ... aber wie ich in der Beschreibung gesagt wurde ich ein lotet von vorhandenen Code für die Filterung neu zu schreiben – vduk225

0

Es funktioniert in Oracle ...

BigDecimal count = (BigDecimal) manager.createNativeQuery(query).getSingleResult();