[Hibernate] @OneToMany - Eine referenzierte Tabelle abfragen

turmaline

Bekanntes Mitglied
Hallo Leute,

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

Java:
@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:
Java:
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
 
Zuletzt bearbeitet:
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?
 
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
 
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
 
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.
Java:
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

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?

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

ja so ist es.

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.


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.
 
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
Code:
Select c.text from  FEEDBACK_COMMENTS fc,  FEEDBACK_COMMENT c where c.id = fc.cid and fc.fid = gesuchtesFeedback
lauten, in HQL etwa
Code:
Select c.text from FeedBack f inner join f.feedbackComments as c where f.id = gesuchtesFeedback

die richtigen Spaltennamen/ Java-Attribute selber dazudenken
 
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.
 
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
 
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
 

Zurück
Oben