# Abfrage über Zwischentabellen?



## rocco82 (12. Mrz 2008)

Hallo Zusammen,

ich hab zwei Tabellen: Eine Tabelle mit Medien und eine zweite Tabelle mit Autoren. Beise Tabellen sind über eine Zwischentabelle medium_auhtors verknüpft.

@ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
@JoinTable(name = "medium_authors",
                joinColumns = @JoinColumn( name = "medium_id", referencedColumnName = "id" ), 
                inverseJoinColumns = @JoinColumn( name = "author_id", referencedColumnName = "lastname" ))
public Set<Author> getAuthors() {
	return this.authors;
}


Wenn ich nun eine Abfage starten will und auf die Zwischentabelle zugreifen will, kommt es zum Fehler:

org.hibernate.hql.ast.QuerySyntaxException: medium_authors is not mapped

Ist ja auch klar, weil der Query auf "Entities" zugreift und diese Zwischentabelle eben keins ist.
Aber wenn ich nun die Zwischentabelle in der Abfrage nicht benutzen kann, wie kann ich dann Medien suchen, die z.B. einen bestimmten Autor haben? Ist bestimmt nur irgendwo ein Trick dabei.

bsp:
entityManager.createQuery("select m from Medium m , Author a, medium_authors ma where...

Gruß
danke für das Lesen


----------



## rocco82 (12. Mrz 2008)

Ok, bin bis hierhin gekommen:

results = entityManager.createQuery(
        		"select distinct m from Medium m left join fetch m.authors a where " +
        		"(lower(m.title) like #{titlePattern}) and " +
                           ...
       			"(a.lastname like #{authorPattern}) " +
        		         		.setMaxResults(pageSize)
                				.setFirstResult(page * pageSize).getResultList();


Das funktioniert ansich ganz gut, nur leider werden in diesem Fall alle Mediun die keinen Autor haben nicht angezeigt.
Ich verstehe das so, dass nur die Mediun angezeigt werden, wo der JOIN zu einer nicht leeren Menge geführt wird. Sprich, wenn das Medium kein Autor referenziert, dann wird der join null und es kommt kein Ergebnis. Kann man die Join-Anweisung dazu zwingen, auch die Datensätze der linken Tabelle Medium anzuzeigen, welche keine Referenz auf ein Datensatz in der rechten Tabelle Author haben?


----------



## semi (12. Mrz 2008)

Deine Bedingung "a.lastname like ..." verhindert es, dass Medien ohne Author in der Ergebnismenge enthalten sind.
Du kannst ein OR versuchen "a is null or a.lastname like ...", die Logik dahinter ist mir aber etwas schleierhaft.
Willst du wirklich alle Medien, deren Author dem Muster entspricht oder solche, die keinen Author haben?


----------

