# Join n:m



## MQue (7. Jul 2009)

Hallo,

muss wieder mal um ein SQL- Statement fragen, DB Vorlesung ist schon lange her und im Skriptum find ichs auch nicht.

bei 3 Tabellen (Person, Person_Event, Events): wie kann ich zu einer Person alle Events finden.
Wäre Euch sehr dankbar.
lg


----------



## The_S (7. Jul 2009)

```
SELECT ev.*
FROM event ev
INNER JOIN person_event pe_ev 
  ON  pe_ev.id_event = ev.id
  AND pe_ev.id_person = :idDerPerson
```


----------



## MQue (7. Jul 2009)

The_S hat gesagt.:


> ```
> SELECT ev.*
> FROM event ev
> INNER JOIN person_event pe_ev
> ...



Vielen Dank, ein Problem hab ich noch, ich würde das in HQL benötigen.
Kann man das auf die schnelle umschreiben,
Danke noch mals,
lg


----------



## The_S (7. Jul 2009)

Auf die Schnelle:

[HQL]SELECT e
FROM Event e
JOIN e.persons p
WHERE p.id = :idDerPerson[/HQL]


----------



## MQue (7. Jul 2009)

The_S hat gesagt.:


> Auf die Schnelle:
> 
> [HQL]SELECT e
> FROM Event e
> ...



war zu schnell für mich  , komm bei der Zeile JOIN e.persons p nicht mit??


----------



## The_S (7. Jul 2009)

persons ist das gemappete Set von Personen, die diesem Event zugeordnet sind.


----------



## MQue (7. Jul 2009)

Da bekomme ich eine Exception:

could not resolve property: Person of: org.hibernate.tutorial.domain.Event [SELECT e 
FROM org.hibernate.tutorial.domain.Event e JOIN e.Person p WHERE p.id = ersonId]
        at org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:67)

aber kein wunder, ich hab (auch) keine Ahnung von HQL.
Wäre dir nochmals sehr dankbar für Hilfe,
lg


```
final List list = session.createQuery("SELECT e FROM Event e JOIN e.Person p WHERE 
p.id = :personId").setString("personId", Long.toString(personId)).list();
```



```
<hibernate-mapping package="org.hibernate.tutorial.domain">
  <class name="Event" table="EVENTS">
    <id column="EVENT_ID" name="id">
      <generator class="increment"/>
    </id>
    <property column="EVENT_DATE" name="date" type="timestamp"/>
    <property name="title"/>
    <set inverse="true" name="participants" table="PERSON_EVENT">
      <key column="EVENT_ID"/>
      <many-to-many class="Person" column="PERSON_ID"/>
    </set>
  </class>
</hibernate-mapping>
```


```
<hibernate-mapping package="org.hibernate.tutorial.domain">
  <class name="Person" table="PERSON">
    <id column="PERSON_ID" name="id">
      <generator class="increment"/>
    </id>
    <property name="age"/>
    <property name="firstname"/>
    <property name="lastname"/>
    <set cascade="all-delete-orphan" name="events" table="PERSON_EVENT">
      <key column="PERSON_ID"/>
      <many-to-many class="Event" column="EVENT_ID"/>
    </set>
  </class>
</hibernate-mapping>
```


----------



## The_S (7. Jul 2009)

Wie schaut denn deine Event Klasse aus? Evtl.

[HQL]SELECT e
FROM Event e
JOIN e.participants p
WHERE p.id = :idDerPerson[/HQL]


----------



## MQue (7. Jul 2009)

The_S hat gesagt.:


> Wie schaut denn deine Event Klasse aus? Evtl.
> 
> [HQL]SELECT e
> FROM Event e
> ...



Halleluja, so funktionierts, mühsam ernährt sich das Eichhörnchen, 
ich seh mich schon im Urlaub mit einem Hibernate- Buch herumlaufen, das wäre nicht das schlechteste 
besten dank für deine Hilfe!!


----------



## The_S (7. Jul 2009)

Michael1234 hat gesagt.:


> Halleluja, so funktionierts, mühsam ernährt sich das Eichhörnchen,
> ich seh mich schon im Urlaub mit einem Hibernate- Buch herumlaufen, das wäre nicht das schlechteste
> besten dank für deine Hilfe!!



Wäre wohl das sinnvollste. Aber zumindest die Basics sind nicht kompliziert. Du fragst keine Tabellen sondern Klassen (bzw. Objekte ab) und greifst auch nicht auf Tabellenspalten, sondern auf Attribute zu. "Sonst" hat sich nichts verändert


----------

