Hibernate: Join auf Subquery?

Status
Nicht offen für weitere Antworten.

GilbertGrape

Bekanntes Mitglied
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):
Code:
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
 
Klar geht das. Guck Dir Kapitel 14.13 (Subqueries) in der Hibernate Referenzdoku an.
 
??

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
 
Das hab ich ja.

Ich versteh nicht, warum dann meine Abfrage nicht funktioniert:
HQL:
Code:
"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:
Code:
@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:
Code:
@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? 😀
 
> 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 😉
 
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.
 
Ich machs jetzt so, dass ich die Ergebnisliste in ein Set speichere. Somit hab ich dann keine doppelten Einträge mehr.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben