-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 14 posts ] 
Author Message
 Post subject: Query mit Joins über mehr als 2 Tabellen...
PostPosted: Wed Sep 14, 2005 10:23 am 
Regular
Regular

Joined: Sat Sep 03, 2005 9:07 am
Posts: 87
Location: Graz, AUSTRIA
Ich hänge bei einem Problem, wie ich eine Hibernate Select Query über mehrere mehrere Tabellen machen kann.

Ein Join mit 2 Tabellen stellt ja noch kein Problem da:

Code:
Select s.ediId, e.paId from EtEdisector as s inner join fetch s.etEdiPartner as e


Nun will ich aber eine weitere Tabelle hinzufügen, die mit der Tabelle etEdiPartner mittels N:1 verbunden ist.

Insgesamt will ich dann eine Query entwickeln, die 5 Joins enthält. Mir würde es aber sicher schon helfen, wenn ich weiß, wie ich über 3 Tabellen einen Join mache.

Im SQL schaut meine Abfrage folgendermaßen aus:

Code:
Select e.s_id, c.company, e.location, b.edisector, e.actisname, g.gw_name, g.ssid, g.sfid, a.method from et_edi_partner e
Inner Join et_company c on e.CO_ID = c.co_id
Inner join et_edisector b on e.EDI_ID = b.edi_id
Inner join et_gateway g on e.GW_ID = g.gw_id
Inner join et_access_method a on g.a_id = a.a_id


Ich habe auch einen ausschnitt des ER-Modells hochgeladen. Hier sind aber nicht alle Tabellen zu sehen, sondern nur die, die ich für diese Query brauche.

[img]http://show.imagehosting.us/show/667340/0/nouser_667/T0_-1_667340.gif"%20alt="Image%20Hosted%20at%20ImageHosting.us[/img]

Wenn ich meine Mapping Files uploaden soll, mach ich das natürlich gerne..Danke im VOraus für eure Hilfe!!!


Top
 Profile  
 
 Post subject:
PostPosted: Wed Sep 14, 2005 10:24 am 
Regular
Regular

Joined: Sat Sep 03, 2005 9:07 am
Posts: 87
Location: Graz, AUSTRIA
Hab vergessen den Alt Tag aus dem Link rauszulöschen, daher nochmals der Bilderupload!

Image


Top
 Profile  
 
 Post subject:
PostPosted: Wed Sep 14, 2005 10:57 am 
Pro
Pro

Joined: Fri Sep 02, 2005 4:21 am
Posts: 206
Location: Vienna
Die weiteren join sind im Prinzip nur "mehr des gleichen".

Wenn du wie in
Code:
inner join fetch s.etEdiPartner as e

e hast, kannst du über seine Beziehung zu ET_GATEWAY den join genauso wie in diesem Codeauschnitt machen.

Sollte es dir noch unklar sein, schicke bitte die Mapping-File (zumindest den Teil mit den Primär- une Fremdschlüssel), dann kann ich richtige Statements schreiben.

Erik


Top
 Profile  
 
 Post subject:
PostPosted: Wed Sep 14, 2005 11:09 am 
Regular
Regular

Joined: Sat Sep 03, 2005 9:07 am
Posts: 87
Location: Graz, AUSTRIA
Hi!

Hab das jetzt folgendermaßen probiert:

Code:
Select s.ediId, e.paId, g.coId from EtEdisector as s
inner join fetch s.etEdiPartner as e
inner join fetch e.gwId as g


Bekomme aber folgenden Fehler:
javax.servlet.ServletException: #{queryHelper.listSearchResults}: javax.faces.el.EvaluationException: java.lang.NullPointerException


Verstehe leider ned ganz, wie ich das Query aufbauen soll. Meine Tabelle ETEDIPartner ist quasi die Haupttabelle. Diese hat wie du beim ER-Modell siehst mehrere N:1 Verbindungen und daran scheitere ich eben...

Vielleicht hilft es dir, wenn du meine Mapping Files siehst:

etedisector
Code:
<hibernate-mapping schema="EDITOOLS" package="com.magnasteyr.editool.hibernate">
  <class name="EtEdisector" dynamic-update="true" dynamic-insert="true" lazy="false" table="ET_EDISECTOR">
    <id name="ediId" type="long" unsaved-value="null">
      <column name="EDI_ID" not-null="true" sql-type="NUMBER"/>
      <generator class="sequence"/>
    </id>
    <property name="edisector" type="string">
      <column name="EDISECTOR" not-null="true" sql-type="VARCHAR2"/>
    </property>
    <bag name="etEdiPartner" lazy="true" inverse="true" cascade="none">
      <key foreign-key="SYS_C0062974">
        <column name="EDI_ID" not-null="true" sql-type="NUMBER"/>
      </key>
      <one-to-many entity-name="com.magnasteyr.editool.hibernate.EtEdiPartner"/>
    </bag>
  </class>
</hibernate-mapping>


etedipartner

Code:
<hibernate-mapping schema="EDITOOLS" package="com.magnasteyr.editool.hibernate">
  <class name="EtEdiPartner" dynamic-update="true" dynamic-insert="true" lazy="false" table="ET_EDI_PARTNER">
    <id name="paId" type="long" unsaved-value="null">
      <column name="PA_ID" not-null="true" sql-type="NUMBER"/>
      <generator class="sequence"/>
    </id>
    <property name="actisname" type="string">
      <column name="ACTISNAME" not-null="true" sql-type="VARCHAR2"/>
    </property>
    <property name="location" type="string">
      <column name="LOCATION" sql-type="VARCHAR2"/>
    </property>
    <property name="dfueStart" type="timestamp">
      <column name="DFUE_START" sql-type="DATE"/>
    </property>
    <property name="dfueEnde" type="timestamp">
      <column name="DFUE_ENDE" sql-type="DATE"/>
    </property>
    <property name="dfueStartAcronym" type="string">
      <column name="DFUE_START_ACRONYM" sql-type="VARCHAR2"/>
    </property>
    <property name="dfueEndeAcronym" type="string">
      <column name="DFUE_ENDE_ACRONYM" sql-type="VARCHAR2"/>
    </property>
    <many-to-one name="sId" entity-name="com.magnasteyr.editool.hibernate.EtPartnerStatus" cascade="save-update" foreign-key="SYS_C0062972">
      <column name="S_ID" not-null="true" sql-type="NUMBER"/>
    </many-to-one>
    <many-to-one name="ediSwId" entity-name="com.magnasteyr.editool.hibernate.EtEdiSw" cascade="save-update" foreign-key="SYS_C0062975">
      <column name="EDI_SW_ID" sql-type="NUMBER"/>
    </many-to-one>
    <many-to-one name="mEdiSwId" entity-name="com.magnasteyr.editool.hibernate.EtMandEdiSw" cascade="save-update" foreign-key="SYS_C0062971">
      <column name="M_EDI_SW_ID" not-null="true" sql-type="NUMBER"/>
    </many-to-one>
    <many-to-one name="faId" entity-name="com.magnasteyr.editool.hibernate.EtFactory" cascade="save-update" foreign-key="SYS_C0062986">
      <column name="FA_ID" not-null="true" sql-type="NUMBER"/>
    </many-to-one>
    <many-to-one name="ediId" entity-name="com.magnasteyr.editool.hibernate.EtEdisector" cascade="save-update" foreign-key="SYS_C0062974">
      <column name="EDI_ID" not-null="true" sql-type="NUMBER"/>
    </many-to-one>
    <many-to-one name="coId" entity-name="com.magnasteyr.editool.hibernate.EtCompany" cascade="save-update" foreign-key="SYS_C0062988">
      <column name="CO_ID" not-null="true" sql-type="NUMBER"/>
    </many-to-one>
    <many-to-one name="gwId" entity-name="com.magnasteyr.editool.hibernate.EtGateway" cascade="save-update" foreign-key="SYS_C0062976">
      <column name="GW_ID" not-null="true" sql-type="NUMBER"/>
    </many-to-one>
       
    <bag name="etDocuments" lazy="true" inverse="true" cascade="none">
      <key foreign-key="SYS_C0062969">
        <column name="PA_ID" not-null="true" sql-type="NUMBER"/>
      </key>
      <one-to-many entity-name="com.magnasteyr.editool.hibernate.EtDocuments"/>
    </bag>
   
    <bag name="etVersions" lazy="true" inverse="true" cascade="none">
      <key foreign-key="SYS_C0062970">
        <column name="PA_ID" not-null="true" sql-type="NUMBER"/>
      </key>
      <one-to-many entity-name="com.magnasteyr.editool.hibernate.EtVersions"/>
    </bag>
    <bag name="etDatasheets" lazy="true" inverse="true" cascade="none">
      <key foreign-key="SYS_C0062968">
        <column name="PA_ID" not-null="true" sql-type="NUMBER"/>
      </key>
      <one-to-many entity-name="com.magnasteyr.editool.hibernate.EtDatasheets"/>
    </bag>
    <bag name="etContactsMany" table="ET_PA2CON" lazy="true" cascade="none">
      <key foreign-key="SYS_C0062966">
        <column name="PA_ID" not-null="true" sql-type="NUMBER"/>
      </key>
      <many-to-many entity-name="com.magnasteyr.editool.hibernate.EtContacts" foreign-key="SYS_C0062964">
        <column name="CON_ID" not-null="true" sql-type="NUMBER"/>
      </many-to-many>
    </bag>
    <bag name="etBusinessConMany" table="ET_PA2BC" lazy="true" cascade="none">
      <key foreign-key="SYS_C0062967">
        <column name="PA_ID" not-null="true" sql-type="NUMBER"/>
      </key>
      <many-to-many entity-name="com.magnasteyr.editool.hibernate.EtBusinessCon" foreign-key="SYS_C0062979">
        <column name="BC_ID" not-null="true" sql-type="NUMBER"/>
      </many-to-many>
    </bag>
  </class>
</hibernate-mapping>


etgateway

Code:
<hibernate-mapping schema="EDITOOLS" package="com.magnasteyr.editool.hibernate">
  <class name="EtGateway" dynamic-update="true" dynamic-insert="true" lazy="false" table="ET_GATEWAY">
    <id name="gwId" type="long" unsaved-value="null">
      <column name="GW_ID" not-null="true" sql-type="NUMBER"/>
      <generator class="sequence"/>
    </id>
    <property name="gwName" type="string">
      <column name="GW_NAME" not-null="true" sql-type="VARCHAR2"/>
    </property>
    <property name="ssid" type="string">
      <column name="SSID" sql-type="VARCHAR2"/>
    </property>
    <property name="sfid" type="string">
      <column name="SFID" sql-type="VARCHAR2"/>
    </property>
    <property name="pwd" type="string">
      <column name="PWD" sql-type="VARCHAR2"/>
    </property>
    <property name="mandSsid" type="string">
      <column name="MAND_SSID" sql-type="VARCHAR2"/>
    </property>
    <property name="mandSfid" type="string">
      <column name="MAND_SFID" sql-type="VARCHAR2"/>
    </property>
    <property name="mandPwd" type="string">
      <column name="MAND_PWD" sql-type="VARCHAR2"/>
    </property>
    <property name="phonenumber" type="string">
      <column name="PHONENUMBER" sql-type="VARCHAR2"/>
    </property>
    <property name="ip" type="string">
      <column name="IP" sql-type="VARCHAR2"/>
    </property>
    <property name="checkNumber" type="long">
      <column name="CHECK_NUMBER" sql-type="NUMBER"/>
    </property>
    <property name="calluserdata" type="long">
      <column name="CALLUSERDATA" sql-type="NUMBER"/>
    </property>
    <many-to-one name="aId" entity-name="com.magnasteyr.editool.hibernate.EtAccessMethod" cascade="save-update" foreign-key="SYS_C0062977">
      <column name="A_ID" not-null="true" sql-type="NUMBER"/>
    </many-to-one>
    <many-to-one name="rId" entity-name="com.magnasteyr.editool.hibernate.EtRouter" cascade="save-update" foreign-key="SYS_C0062978">
      <column name="R_ID" not-null="true" sql-type="NUMBER"/>
    </many-to-one>
    <bag name="etEdiPartner" lazy="true" inverse="true" cascade="none">
      <key foreign-key="SYS_C0062976">
        <column name="GW_ID" not-null="true" sql-type="NUMBER"/>
      </key>
      <one-to-many entity-name="com.magnasteyr.editool.hibernate.EtEdiPartner"/>
    </bag>
  </class>
</hibernate-mapping>


Wäre toll, wenn du mir ein Beispiel zeigen könntest, wie ich den Join hinbekomme.

Habe nun auch was gelesen von joins die so ausschauten:
Code:
item.bid.name

Sind hier ebenfalls 3 Tabellen miteinander verbunden?

Danke im Voraus!


Top
 Profile  
 
 Post subject:
PostPosted: Wed Sep 14, 2005 11:44 am 
Pro
Pro

Joined: Fri Sep 02, 2005 4:21 am
Posts: 206
Location: Vienna
Bevor ich mich darauf stürze dein Statement zu bauen und zu testen, eine Frage: könntest du den ganzen Stacktrace zu
Code:
javax.servlet.ServletException: #{queryHelper.listSearchResults}: javax.faces.el.EvaluationException: java.lang.NullPointerException

schicken, da ich gerne sehen möchte, was der Fehler von Hibernate-Seite ist.

Was du geschrieben hast, scheint mir nämlich im ersten Augenblick richtig zu sein.

Erik


Top
 Profile  
 
 Post subject:
PostPosted: Thu Sep 15, 2005 1:24 am 
Pro
Pro

Joined: Fri Sep 02, 2005 4:21 am
Posts: 206
Location: Vienna
Hallo,

Ich habe den Fehler reproduziert.
Dann habe ich festgestellt, dass es sich bei dem Problem um einen bekannten Fehler handelt, der unter http://opensource2.atlassian.com/projects/hibernate/browse/HHH-806
bereits gemeldet wurde - und in Hibernate 3.1.0 beta korrigiert wurde - aber auf eine 3.0.6 warten würde (weiß nicht eine solche geplant ist bzw. wann).

Ich weiß nicht, ob eine 3.1 beta für dich eine Option ist. Wenn nicht, habe ich die auch von dir erwähnte Alternative gefunden, die vielleicht fürs erste helfen kann:

Code:
Select s.id, s.etEdiPartner.id, s.etEdiPartner.gwId.id from EtEdisector s

Wie optimal/nicht optimal das daraus generierte SQL statement ist, habe ich nicht geprüft. Wenn alle Stricke reißen sollten, bleibt noch immer SQLQuery.

Oder vielleicht hat ein erfahrenerer Hibernate User eine bessere Idee?

Erik


Top
 Profile  
 
 Post subject:
PostPosted: Thu Sep 15, 2005 3:05 am 
Regular
Regular

Joined: Sat Sep 03, 2005 9:07 am
Posts: 87
Location: Graz, AUSTRIA
Hallo

Erstmals danke für deine Hilfe!

Habe nun mal folgendes Statement probiert:

Code:
Query q = session.createQuery("Select e.paId, e.sId, e.coId.company, e.location from EtEdiPartner as e");


Das Problem dabei ist, dass danach extrem viele Selects gemacht werden und das Select Schlussendlich mehr Spalten enthält, als es enthalten soll...
Wenn ich dann das ganze Statement (Welches ich ganz oben in SQL geschrieben habe) hinschreibe, bekomme ich einen OutofMemory Error, weil er so viele Selects abschießt, dass die DB da anscheinend nicht mehr mitspielt...

Was ich ned verstehe ist, warum er für diese Query eben dieses Statement zusammenbaut:
Code:
select etedipartn0_.PA_ID as col_0_0_, etedipartn0_.S_ID as col_1_0_, etcompany1_.COMPANY as col_2_0_, etedipartn0_.LOCATION as col_3_0_, etedipartn0_.PA_ID as PA1_, etedipartn0_.ACTISNAME as ACTISNAME14_, etedipartn0_.LOCATION as LOCATION14_, etedipartn0_.DFUE_START as DFUE4_14_, etedipartn0_.DFUE_ENDE as DFUE5_14_, etedipartn0_.DFUE_START_ACRONYM as DFUE6_14_, etedipartn0_.DFUE_ENDE_ACRONYM as DFUE7_14_, etedipartn0_.S_ID as S8_14_, etedipartn0_.EDI_SW_ID as EDI9_14_, etedipartn0_.M_EDI_SW_ID as M10_14_, etedipartn0_.FA_ID as FA11_14_, etedipartn0_.EDI_ID as EDI12_14_, etedipartn0_.CO_ID as CO13_14_, etedipartn0_.GW_ID as GW14_14_ from EDITOOLS.ET_EDI_PARTNER etedipartn0_, EDITOOLS.ET_COMPANY etcompany1_ where etedipartn0_.CO_ID=etcompany1_.CO_ID


Irgendeine Erklärung und Verbesserungsvorschläge?


Top
 Profile  
 
 Post subject: Nun auch noch Probleme mit CreateSQLQuery
PostPosted: Thu Sep 15, 2005 4:06 am 
Regular
Regular

Joined: Sat Sep 03, 2005 9:07 am
Posts: 87
Location: Graz, AUSTRIA
Hab jetzt auch noch ein SQLQuery versucht, aber auch hier scheitere ich.

Erstmals fang ich es etwas komisch, dass die Methode createSQLQuery nur mehr einen String braucht und man den Alias und den Klassennamen nur mehr als addEntity hinzufügen kann (diese Implementierung fand ich in keiner Docu...)

Und sobald ich nun bestimmte Spalten auslesen will, bekomme ich den Fehler:
Code:
exception

javax.servlet.ServletException: #{queryHelper.listSearchResults}: javax.faces.el.EvaluationException: org.hibernate.exception.SQLGrammarException: could not execute query
   javax.faces.webapp.FacesServlet.service(FacesServlet.java:209)

root cause

javax.faces.FacesException: #{queryHelper.listSearchResults}: javax.faces.el.EvaluationException: org.hibernate.exception.SQLGrammarException: could not execute query
   com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:78)
   javax.faces.component.UICommand.broadcast(UICommand.java:312)
   javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:267)
   javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:381)
   com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:75)
   com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:200)
   com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:90)
   javax.faces.webapp.FacesServlet.service(FacesServlet.java:197)



Meine Code:
Code:
String sql ="Select e.PA_ID as {e.paId} from ET_EDI_Partner {e}";
         
         Query q = session.createSQLQuery(sql)
         .addEntity("e",EtEdiPartner.class);
         querylist=q.list();



Komischerweise hat dies funktioniert:

Code:
String sql ="Select {e.*}  from ET_EDI_Partner {e}";
         
         Query q = session.createSQLQuery(sql)
         .addEntity("e",EtEdiPartner.class);
         querylist=q.list();


Langsam fang ich bei Hibernate wirklich zum Verzweifeln an, weil leider nichts so funktioniert, wie ich es mir vorstelle...

Bitte wiederum um Hilfe!


Top
 Profile  
 
 Post subject:
PostPosted: Thu Sep 15, 2005 12:56 pm 
Pro
Pro

Joined: Fri Sep 02, 2005 4:21 am
Posts: 206
Location: Vienna
Nur ein kurze Zwischenantwort meinerseits: ich habe auch
Code:
Query q = session.createQuery("Select e.paId, e.sId, e.coId.company, e.location from EtEdiPartner as e");

getestet mit dem selben Ergebnis wie du. Da ist etwas faul. Meine weiteren "Experimente" lassen mir denken, dass 3.0.5 in Bereich etwas "kaputt" ist - ich werde die Tests mit 3.1 durchführen - da sind zumindest einige Probleme behoben. Ich melde mich wieder - falls du keine Lösung inzwischen findest oder sonst jemand weiß, was da los ist.

Das OutOfMemory ist da schon eine andere Kategorie, da müsste man den Log einschalten, um zu sehen, was sich intern abspielt.

Habe mir das Thema SQLQuery noch nicht angeschaut.

Erik


Top
 Profile  
 
 Post subject:
PostPosted: Fri Sep 16, 2005 2:45 am 
Regular
Regular

Joined: Sat Sep 03, 2005 9:07 am
Posts: 87
Location: Graz, AUSTRIA
Es Problem is, dass 3.1 noch ne Beta is und ich (aufgrund von Firmenpolicies) ned wirklich a Beta verwenden soll...
Meinst du dass es wirklich a Bug ist? Soll ich den einmal reporten?

Und bei SQLQueries kannst du mir ned weiterhelfen?


Top
 Profile  
 
 Post subject:
PostPosted: Fri Sep 16, 2005 4:10 am 
Pro
Pro

Joined: Fri Sep 02, 2005 4:21 am
Posts: 206
Location: Vienna
Der Test mit der 3.1 hätte den Zweck zu prüfen, ob das Problem vielleicht schon bekannt ist und bereits behoben wurde - wenn das Problem auch in der 3.1 ist, dann sollten wir vorsichtig fragen, ob es sich um ein Fehler handeln könnte...

Was SQLQuery betrifft, möchte ich dir sicher auch gerne helfen, bin z.Z. aber ziemlich beschäftigt und habe bisher die Zeit nicht finden können, es nachzustellen.

Erik


Top
 Profile  
 
 Post subject:
PostPosted: Fri Sep 16, 2005 4:15 am 
Regular
Regular

Joined: Sat Sep 03, 2005 9:07 am
Posts: 87
Location: Graz, AUSTRIA
Habe jetzt mal folgendes Statement probiert:
Code:
SELECT e.paId, e.coId.company, e.location, e.ediId.edisector, e.actisname, e.gwId.gwName, e.gwId.ssid, e.gwId.aId.method FROM EtEdiPartner e


Und verwende nun 3.1 beta 3

Es funktioniert und es werden nicht zig Selects gemacht? Abfrage ist so wie ich es will.

Werd das nachher nochmals mit hibernate 3.0.5 probieren. Sollten dort wieder zig Selects entstehen, werd ich das als Bug melden!


Top
 Profile  
 
 Post subject:
PostPosted: Fri Sep 16, 2005 6:01 am 
Pro
Pro

Joined: Fri Sep 02, 2005 4:21 am
Posts: 206
Location: Vienna
Semmerl wrote:
Werd das nachher nochmals mit hibernate 3.0.5 probieren. Sollten dort wieder zig Selects entstehen, werd ich das als Bug melden!

Wenn es in 3.1 korrigiert, gehe ich davon aus, dass das Problem bereits gemeldet worden ist - habe aber (allerdings nur nach kurzer Suche) nichts gefunden.

Eine interessante Frage ist auch, ob das Problem in 3.0.6 korrigiert sein wird, und wann 3.0.6 geplant ist.

Erik


Top
 Profile  
 
 Post subject:
PostPosted: Sun Sep 18, 2005 5:45 am 
Pro
Pro

Joined: Fri Sep 02, 2005 4:21 am
Posts: 206
Location: Vienna
Zu den Problemen mit SQLQuery: siehe meine Antwort von Sun Sep 18, 2005 11:43 am in http://forum.hibernate.org/viewtopic.php?t=947640.

Erik


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 14 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.