# [Hibernate] @OneToMany - Eine referenzierte Tabelle abfragen



## turmaline (3. Jan 2011)

Hallo Leute,

in der Tabelle "T_FEEDBACK" habe ich ein Attribut feedbackComments:


```
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinTable(name = "T_FEEDBACK_COMMENTS",
    		   joinColumns = {@JoinColumn(name = "feedbackId", referencedColumnName="id")},
    		   inverseJoinColumns = {@JoinColumn(name = "commentId", referencedColumnName="id")})
    protected List<Comment> feedbackComments = new ArrayList<Comment>();
```

Wie kann ich dieses Feld per SQL-Query abfragen? So funktioniert schon mal nicht:

```
String select = "Select FEEDBACKCOMMENTS from " + TABLE_FEEDBACK + ";";
            
ResultSet result = executeSQL(select, conn);
```

ich hab versucht eine Lösung im Internet zu finden, nur anscheinend google ich mit falschen Begriffen, denn ich finde nichts (kann mir jedoch nicht vorstellen, dass ich die ienzige bin, die das Problem hat).
Kann mir jemand helfen?

Gruß,
Madlena


----------



## turmaline (3. Jan 2011)

sorry... im falschen Forum - wie kann ich das Thema verschieben?


----------



## SlaterB (3. Jan 2011)

Select * from T_FEEDBACK_COMMENTS

ist diese Tabelle denn wirklich vorhanden? vorher mit DB-Tool nachschauen,
wird in Java wirklich eine SQL- und keine HQL-Query ausgeführt? 
was soll das Feld 'FEEDBACKCOMMENTS' in dieser SQL-Tabelle sein? ich schätze es gibt nur feedbackId/ commentId

und man muss es immer wieder fragen: was ist denn die Fehlermeldung?


----------



## turmaline (3. Jan 2011)

ja die Tabelle existiert. Aber bekomme ich nicht nur die ids (denn die Tabelle FEEDBACK_COMMENTS) hat nur zwei spalten mit ids und ich brauche die Ergebnisse aus der Tabelle FEEDBACK_COMMENT - also alle Kommentare die zu einem bestimmten FEEDBACK gehören


----------



## SlaterB (3. Jan 2011)

langsam langsam langsam, 
es geht zunächst mal um T_FEEDBACK_COMMENTS, ich lese jetzt dass die Tabelle da ist und 
> Select * from T_FEEDBACK_COMMENTS
dann bestimmt funktioniert?

als nächstest sprichst du von einer Tabelle FEEDBACK_COMMENTS, was kann das denn sein, meinst du damit eine SQL-Tabelle?
existiert diese oder wünschst du dir das nur?
ich könnte mir vorstellen dass das die normal vorhandere SQL-Tabelle zu einer deiner Hibernate-Entities ist,
allerdings komisch benannt, wenn es FEEDBACK gibt und COMMENT, was steht dann in FEEDBACK_COMMENTS? 
die Verknüpfung liegt doch schon in T_FEEDBACK_COMMENTS, also da musst du evtl. bisschen mehr erklären,
ist FEEDBACK_COMMENTS die Tabelle zu Comment?


wenn aber in der Verknüpfungstabelle nur Ids sind, du aber den Text von Kommentaren oder Feedbacks brauchst, dann musst du wohl Joinen,

was spricht eigentlich gegen eine HQL-Anfrage? könnte einfacher werden, auf jeden Fall sauberer wenn man schonmal Hibernate hat


----------



## turmaline (3. Jan 2011)

SlaterB hat gesagt.:


> langsam langsam langsam,
> es geht zunächst mal um T_FEEDBACK_COMMENTS, ich lese jetzt dass die Tabelle da ist und
> > Select * from T_FEEDBACK_COMMENTS
> dann bestimmt funktioniert?



ja das funktioniert, habe gerade ausprobiert. 

```
String select = "Select * from " + TABLE_FEEDBACK_COMMENTS + " where feedbackId = " + feedbackId + ";";
            
            ResultSet result = executeSQL(select, conn);
            while(result.next()) {
                System.out.println(result.getLong("COMMENTID"));
            }
```

so komme ich auf die id's von den Comments - aber ich brauche nun die Comments selbst, hole ich mir sie jetzt über die ids? ???:L



SlaterB hat gesagt.:


> als nächstest sprichst du von einer Tabelle FEEDBACK_COMMENTS, was kann das denn sein, meinst du damit eine SQL-Tabelle?
> existiert diese oder wünschst du dir das nur?



sorry die farge verstehe ich nicht ganz.. wie könnte ich sie denn abfragen wenn sie nicht existieren würde?



SlaterB hat gesagt.:


> ich könnte mir vorstellen dass das die normal vorhandere SQL-Tabelle zu einer deiner Hibernate-Entities ist,



ja so ist es.



SlaterB hat gesagt.:


> allerdings komisch benannt, wenn es FEEDBACK gibt und COMMENT, was steht dann in FEEDBACK_COMMENTS?
> die Verknüpfung liegt doch schon in T_FEEDBACK_COMMENTS, also da musst du evtl. bisschen mehr erklären,
> ist FEEDBACK_COMMENTS die Tabelle zu Comment?



ok ich dachte aus dem Code in meiner ertsen Nachricht ist es klar was in der Tabelle FEEDBACK_COMMENTS drinsteht. Das ist eine JoinTable mit zwei Spalten: feedbackId und commentId (siehe den Code in der ersten Nachricht). SO... Ich habe noch eine Tabelle FEEDBACK_COMMENT und dort sind die Comments drin.




SlaterB hat gesagt.:


> was spricht eigentlich gegen eine HQL-Anfrage? könnte einfacher werden, auf jeden Fall sauberer wenn man schonmal Hibernate hat



nichts spricht dagegen - nur dass ich ein ziemlicher anfänger bin und sehr wenig Ahnung auch von sql habe.


----------



## SlaterB (3. Jan 2011)

ganz oben steht dass T_FEEDBACK_COMMENTS die JoinTable ist, zumindest im Codeblock,
T_FEEDBACK_COMMENTS oder FEEDBACK_COMMENTS ist schon ein Unterschied


die Query könnte ungefähr so 

```
Select c.text from  FEEDBACK_COMMENTS fc,  FEEDBACK_COMMENT c where c.id = fc.cid and fc.fid = gesuchtesFeedback
```
lauten, in HQL etwa

```
Select c.text from FeedBack f inner join f.feedbackComments as c where f.id = gesuchtesFeedback
```

die richtigen Spaltennamen/ Java-Attribute selber dazudenken


----------



## turmaline (3. Jan 2011)

danke Dir für Deine Antwort, die Query habe ich gerade so probiert auszuführen:

[Java]
String select = "Select c.id, c.text, c.created, c.author, c.createdInSgd, c.read from " + TABLE_FEEDBACK_COMMENTS +" fc " + TABLE_COMMENT + " c where c.id = fc.commentId  and fc.feedbackId = " + feedbackId + ";";
[/Java]

worauf ich folgende Meldung bekommen habe:
org.h2.jdbc.JdbcSQLException: Feld "C.ID" nicht gefunden
Column "C.ID" not found; SQL statement:
Select c.id, c.text, c.created, c.author, c.createdInSgd, c.read from T_FEEDBACK_COMMENTS fc T_FEEDBACK_COMMENT c where c.id = fc.commentId  and fc.feedbackId = 1; [42122-134]

Das Feld id in der Tabelle T_FEEDBACK_COMMENT existiert.


----------



## SlaterB (3. Jan 2011)

da fehlt ein Komma hinter der fc-Tabelle, siehe meine Vorlage,
besser immer mit SELECT * oder count(*) anfangen, dann sollte es für dieses vergessene Komma immer noch eine Fehlermeldung geben


----------



## turmaline (4. Jan 2011)

funktioniert jetzt! vielen Dank!


----------



## turmaline (4. Jan 2011)

noch eine frage: eigentlich frage ich zuerst nach den Feedbacks und dann in einer anderen methode (da es nicht immer benötigt wird) nach den zu diesem feedback zugehörigen comments. somit muss ich die sql connection zwei mal aufmachen. hab kein gutes gefühl dabei..???:L


----------



## SlaterB (4. Jan 2011)

dann unterlasse dieses Vorgehen


----------

