2017-01-13 6 views
0

Ich habe eine Hibernate-Abfrage, um eine Liste von Zeilen abzurufen, die auf eine maximale Anzahl beschränkt ist. Aber wenn ich die Hibernate-Protokolle, zu meiner Überraschung zu lesen, filtert es intern eine Unterabfrage, die nur eine Zeile hat select count(*)Warum protokolliert Hibernate eine andere Abfrage, die nicht ausgeführt wird?

-- Log4j 
-- INFO [STDOUT] Hibernate: 
select * 
from (select count(*) as y0_ 
     from yyy this_ 
     where this_.type=3 and 
        this_.VALUE=2 and 
        this_.src='ZZZZZ' 
    ) 
where rownum <= 100; 

Die outter Kriterien wird wie folgt aus:

criteria.setProjection(Projections.rowCount()); 
criteria.setMaxResults(MAX_RESULTS); // MAX_RESULTS = 100 

final List results = criteria.list(); // It executes the above query here. 

Was ist die Erklärung dafür Verhalten? Ich habe mehr Abfragen mit diesem irreführenden Ergebnis in den Protokollen.

Antwort

2

Sie setzen eine Zählprojektion. Das macht überwintern die Zählung zurück:

select count(*) from ... 

Dann sind Sie Hibernate zu sagen, auch wenn es keine Möglichkeit gibt, mehr als eine einzige Zeile für eine solche Abfrage zu erhalten, um die Liste der zurückgegebenen Zeilen zu maximal 100 Zeilen zu begrenzen. Die richtige Art und Weise zu tun, dass Ihre Datenbank zu tun, was Hibernate funktioniert:

select * from (<original query>) where rownum <= 100; 

Wenn Sie nicht, dass nutzlos Verpackung Abfrage wollen, dann rufen Sie einfach nicht die nutzlose setMaxResults(100) Methode.

+0

Was ich meine, ist, dass der SetMaxResulst tatsächlich die abgerufenen Daten um 100 filtert. Es ist notwendig. Ich mache eine innere Abfrage und es hat zum Beispiel 1500 zurückgegebene Werte, also brauche ich den 100 Filter, um nicht zu überlasten. Es filtert wie vorgesehen. Auf der anderen Seite interpretiert Hibernate die Abfrage anders als wenn sie nur 1 zählt (*). Ich werde die Frage mit der inneren Abfrage aktualisieren. Danke für deine schnelle Antwort. – another

+0

Eine Abfrage, die eine Anzahl von Auszählungen (*) ohne Gruppierung nach ausführt, kann nicht mehr als 1 Zeile zurückgeben. Es wird niemals 1500 Reihen zurückgeben. –

+0

Ich werde den Code erweitern, ich könnte einen Code unterbewerten. – another

Verwandte Themen