# Hibernate: Join auf Subquery?



## GilbertGrape (3. Nov 2008)

Hallo,

Ich möchte gern einen Join auf eine Unterabfrage erzeugen.
Die Datenbank kann das. Da hab ich das schon probiert. Aber kann HQL das auch?

Ich hab im Tutorial nur das hier gefunden und da steht ja nichts von Joins.

Meine Datenbankabfrage sieht so aus (also in normalem SQL):

```
select a.*
from unmodified_text a 
inner join 
(select distinct unmodifiedtext from unmodifiedtext_paragraph) b
ON a.id=b.unmodifiedtext;
```

Ich will nur wissen, ob man sowas in HQL machen kann.
Wenn ja, muss ich den Fehler in meiner HQL-Abfrage suchen   

Danke, Gilbert


----------



## byte (3. Nov 2008)

Klar geht das. Guck Dir Kapitel 14.13 (Subqueries) in der Hibernate Referenzdoku an.


----------



## SlaterB (3. Nov 2008)

??

der im ersten Posting angegebene Link ist doch genau das Kapitel
oder gehts noch weiter?

ich habe danach auch mal lange gesucht, meinen bisherigen Kenntnissen nach ist das nicht möglich,

SubQueries nur im SELECT oder WHERE, nicht im FROM


----------



## GilbertGrape (3. Nov 2008)

Das hab ich ja.

Ich versteh nicht, warum dann meine Abfrage nicht funktioniert:
HQL:

```
"from UnmodifiedText as t join" +
						"(select distinct utp.unmodifiedText from UnmodifiedText_Paragraph utp) as u " +
						"on u.id=t.id"
```

Hier kurz die Struktur der entsprechenden persistenten Klassen:

Verknüpfungstabelle UnmodifiedText_Paragraph:

```
@Entity
@Table
public class UnmodifiedText_Paragraph {
...
@EmbeddedId
	private Id id = new Id();
	@Column
	private Integer position;
	@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
	@JoinColumn(name = "unmodifiedText",insertable = false,	updatable = false)
	private UnmodifiedText unmodifiedText;
	@ManyToOne(cascade = {CascadeType.PERSIST,CascadeType.MERGE})
	@JoinColumn(name = "paragraph",insertable = false,	updatable = false)
	@Cascade(value = org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
	private Paragraph paragraph;
...
```

UnmodifiedText:

```
@Entity
@Table(name = "UNMODIFIED_TEXT")
public class UnmodifiedText {

        @Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	Long id;
        @OneToMany(mappedBy = "unmodifiedText", fetch=FetchType.EAGER, cascade=CascadeType.REMOVE)
        Set<UnmodifiedText_Paragraph> utp = new HashSet<UnmodifiedText_Paragraph>();
```

@Slater:
1. vielen Dank dafür


			
				SlaterB hat gesagt.:
			
		

> ??
> der im ersten Posting angegebe Link ist doch genau das Kapitel
> oder gehts noch weiter?


2. also gehört der Join in deine FROM-Kategorie? Und wie machst du das denn, wenn sowas nicht geht?

3. Warst du im Urlaub?


----------



## SlaterB (3. Nov 2008)

>  also gehört der Join in deine FROM-Kategorie? 

diese Kategorisierung sei dir selbst überlassen, sonst hat das eh keinen Zweck 

> Und wie machst du das denn, wenn sowas nicht geht? 

tja, bisher hatte ich einmal eine View in der DB angelegt und diese als normales Hibernate-Objekt gemappt 

da die Anfragen aber auch mal dynamisch zu ändern sind über die Mittel von einfachen WHERE x = y Einschränkungen hinaus,
bin ich langsam doch wieder bei SQL-Anfragen..

3.
ach, merkt man doch gar nicht


----------



## byte (3. Nov 2008)

Sry, vergesst meinen Post.


----------



## GilbertGrape (3. Nov 2008)

Nagut, dann kann ich ja nochmal sagen was ich genau will. Vielleicht weiß ja jemand ne andere Lösung.

Ich hab eine Tabelle Unmodified_Text und eine andere Tabelle, wo Unmodified_Text Fremdschlüssel ist. Nun hätte ich gern alle Einträge aus Unmodified_Text, die mindestens einmal in der Verknüpfungstabelle referenziert sind. Wenn ein Datensatz mehrfach referenziert ist, möchte ich den aber trotzdem nur einmal erhalten.

Ich hatte mir ja gedacht, dass ich einfach ein select distinct auf die Verknüpfungstabelle (über die Unmodified_Text id) mache und darauf dann den Join anwende, aber so geht das ja nu nicht so einfach.


----------



## GilbertGrape (3. Nov 2008)

Ich machs jetzt so, dass ich die Ergebnisliste in ein Set speichere. Somit hab ich dann keine doppelten Einträge mehr.


----------

