# Hibernate many-to-many SubSelect Problem



## schuby-doo (9. Oktober 2007)

Hallo ich habe ein Problem mit Hibernate un Subselects bei Many-to-Many verknüpfungen.

Ich habe zwei Tabellen Person und Event, die über Sets und eine Verknüpfungstabelle Miteinander verbunden sind. 

Das einfügen und Abrufen aus der Datenbank funktioniert. Nur bei Abfragen mit Subselects gibt es Probleme 

Person.hbm.xml

```
<hibernate-mapping>
    <class name="events.Person" table="PERSON">
        <id name="id" column="PERSON_ID">
            <generator class="native"/>
        </id>
        <property name="age"/>
        <property name="firstname"/>
        <property name="lastname"/>

        <set name="events" table="PERSON_EVENT">
            <key column="PERSON_ID"/>
            <many-to-many column="EVENT_ID" class="events.Event"/>
        </set>
    </class>
```

Event.hbm.xml

```
<hibernate-mapping>
    <class name="events.Event" table="EVENTS">
        <id name="id" column="EVENT_ID">
            <generator class="native"/>
        </id>
        <property name="date" type="timestamp" column="EVENT_DATE"/>
        <property name="title"/>

        <set name="participants" table="PERSON_EVENT" inverse="true">
            <key column="EVENT_ID"/>
            <many-to-many column="PERSON_ID" class="events.Person"/>
        </set>
    </class>
</hibernate-mapping>
```

Event.java

```
package events;
import java.util.*;
public class Event {
    private Long id;
    private String title;
    private Date date;
    private Set participants = new HashSet();

	public Event() {}

    public Long getId() {
        return id;
    }

    private void setId(Long id) {
        this.id = id;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
    
    public Set getParticipants() {
        return participants;
    }

    public void setParticipants(Set participants) {
        this.participants = participants;
    }
}
```

Person.java

```
package events;
import java.util.*;
public class Person {

    private Long id;
    private int age;
    private String firstname;
    private String lastname;
    private Set events = new HashSet();

	public Person() {}


    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getFirstname() {
        return firstname;
    }

    public void setFirstname(String firstname) {
        this.firstname = firstname;
    }

    public String getLastname() {
        return lastname;
    }

    public void setLastname(String lastname) {
        this.lastname = lastname;
    }

    // Defensive, convenience methods
    protected Set getEvents() {
        return events;
    }

    protected void setEvents(Set events) {
        this.events = events;
    }

    public void addToEvent(Event event) {
        this.getEvents().add(event);
        event.getParticipants().add(this);
    }

    public void removeFromEvent(Event event) {
        this.getEvents().remove(event);
        event.getParticipants().remove(this);
    }
}
```

Ich habe versucht  aller Personen herauszufinden denen ein bestimtes Event zugeordnet ist.


```
Query q=session.createQuery("select p from Person p where p.events in (select e.id from Event e where e.title like '%1%' )");
List liste = q.list();
```

Dabei bekomme ich immer folgende Fehlermeldung:

```
Hibernate: select person0_.PERSON_ID as PERSON1_2_, person0_.age as age2_, person0_.firstname as firstname2_, person0_.lastname as lastname2_ from PERSON person0_, PERSON_EVENT events1_, EVENTS event2_ where person0_.PERSON_ID=events1_.PERSON_ID and events1_.EVENT_ID=event2_.EVENT_ID and (. in (select event3_.EVENT_ID from EVENTS event3_ where event3_.title like '%1%'))
2007-10-09 21:14:20,250 WARN [org.hibernate.util.JDBCExceptionReporter] - <SQL Error: 936, SQLState: 42000>
2007-10-09 21:14:20,250 ERROR [org.hibernate.util.JDBCExceptionReporter] - <ORA-00936: Ausdruck fehlt
>
Exception in thread "main" org.hibernate.exception.SQLGrammarException: could not execute query
```

Habe ich bei der Abfrage einen denkfehler gemacht oder warum geht das nicht?

Die gesamten Dateien sind übrigens aus dem Hibernate Tutorial von hibernate.org

Ich weiß nicht, ob das irgend einen Einfuß hat aber die Datenbank ist Oracle 10

Vielen Dank im voraus für Eure Hilfe.

schuby-doo


----------

