URL: https://www.overclockers.at/coding-stuff/subquery_im_hql_java_hibernate_194388/page_1 - zur Vollversion wechseln!
Morgen...
ich sitz seit über einer stunde an nem Problem, welches ich früher mittels SQL innerhalb von 10 minuten hatte:
Die Datenbank sieht folgendermaßen aus:
2 Tabellen, Person + Krankheit
Personen haben namen, geburtsdaten, etc
Krankheiten haben nen Namen und ne Dauer.
zwichen Personen und Krankheiten ist ne 1:n, eine person kann also mehrere Krankheiten haben..
Die Aufgabenstellung:
Ich muss herausfinden, wieviel Personen krank waren.
der Teil ist Simpel: SELECT count(*) FROM Person WHERE Person.krankheiten.size > 0;
jetzt wirds happig: Es soll herausgefunden werden, wie LANGE waren diese Personen krank (nicht pro Person sondern für ALLE zusammen!).
der HQL ansatz von mir ist folgender:
Code:Query query1 = session.createQuery(" SELECT count(*), sum(durs) FROM (SELECT sum(k.dauer) as durs FROM Person p LEFT JOIN p.krankheiten k WHERE p.krankheiten.size > 0 GROUP BY k.person) ");
Code:Query query1 = session.createQuery(" SELECT count(p), sum (SELECT sum(k.dauer) FROM p.krankheiten k) FROM Person p WHERE p.krankheiten.size > 0");

vielleicht blick ich auch gar nicht durch, aber was ist mit der query:
Code:SELECT Person, SUM(dauer) FROM Person INNER JOIN Krankheit ON (....) GROUP BY Person
du bekommst bei der abfrage dann immer die Person + die Summe seiner krankheitsdauer...
ich will die Anzahl der personen und die summe über die Krankheiten von ALLEN der personen... somit müsst ma da über ein subselect drüberrodeln, was aber Hibernate im FROM teil ned unterstützt... somit wärn ma wieder beim startproblem... SQL wär eh ka problem, HQL is das problem
edit: aufgabenstellung: Wieviel Personen waren krank + wie lange waren diese personen krank. am ende soll rauskommen 330 personen waren insgesammt 499523 tage krank.
ich kann grad leider nur herumraten, weil mein notebook nicht da ist (sql am zettel zähl ich nicht zu meinen stärken), aber vielleicht kriegst ja einen denkanstoß...
was is mit:
Code:SELECT COUNT(DISTINCT Person), SUM(Dauer) FROM Person INNER JOIN Krankheit WHERE --was halt sein muss

hint: hql ist kein schreibfehler, sondern eine (sql-ähnliche) abfragesprache, siehe http://www.hibernate.org/hib_docs/v...l/queryhql.html 
Zitat von DKCHhint: hql ist kein schreibfehler, sondern eine (sql-ähnliche) abfragesprache, siehe http://www.hibernate.org/hib_docs/v...l/queryhql.html

ehrlichgsagt: ich bin ma im moment ned so ganz sicher, wie das funktioniern kann, vor allem das Distinct macht ma kopfweh... du redest hier eh hoffentlich von der HQL oder? weil mit sql hat diese konstruktion nimmer viel ztun (dafür würd das distinct scho an der falschn stelle stehen)
Zitat von semteXehrlichgsagt: ich bin ma im moment ned so ganz sicher, wie das funktioniern kann, vor allem das Distinct macht ma kopfweh... du redest hier eh hoffentlich von der HQL oder? weil mit sql hat diese konstruktion nimmer viel ztun (dafür würd das distinct scho an der falschn stelle stehen)
Zitat von semteXwie mach ich das jetzt am besten? Wenn ma das eine query auf 2 aufteilen müssten, wärs auch kein Problem
ich demonstrier es am besten:Zitat von LuzandroIch hab zwar keine Ahnung von HQL, aber wozu brauchst du überhaupt die Personen, wenn dich nur die Gesamtdauer über alle Krankheiten interessiert? Das klingt für mich eigentl. nach einer simplen Summe über eine Spalte einer einzelnen Tabelle?
Code: PHPPerson ID | Name 1 Hans 2 Franz Krankheit ID | Name | Dauer | personId 1 schnupfen 4 1 2 nasenbluten 12 1 3 haba haba woot 99 2 4 fadheit 2 2
Dann willst du es also doch in einer einzelnen Query haben
laut dem hql-link oben müsste distinct aber schon funktionieren
ZitatThe distinct and all keywords may be used and have the same semantics as in SQL.
select distinct cat.name from Cat cat
select count(distinct cat.name), count(cat) from Cat cat
Code:select count(distinct k.personId), sum(k.dauer) from Krankheit k
mhm, das könnte so funktioniern... werds am montag in der arbeit probiern, danke!
edit: das vom prayerslayer müsst dann eigentlich auch funktioniern, ich war nur mit dieser syntax ned vertraut...
je ein bier an den Luzandro und den prayerslayer... wenn ma uns mal sehen lassts mich ned vergessn, dann geb ich euch eins aus 
ein bier mit sql verdient... dass ich DAS noch erleben darf 
Zitat von prayerslayerein bier mit sql verdient... dass ich DAS noch erleben darf
overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2026