# [Hibernate] Criterion-Query in HQL übersetzen



## poffi (8. Jan 2007)

Hallo zusammen

Ich habe zwei persistente Klassen "Parent" und "Child". "Child" habe ich als one-to-many-Beziehung gemapt.
Ein HQL soll nun alle "Parents" herauslesen, deren Childnummer einen bestimmten Wert entspricht (Childnr. ist nicht der Primarykey):

"from ch.***.Parent where child.childNr = :childNr"

Dies ergab bei mir immer den folgenden Fehler:
"could not resolve property: childNr"

Also versuchte ich es anhand von Criterion:
Criteria criteria = session.createCriteria(Parent.class);
criteria.createCriteria("child").add(Expression.eq("childNr", childNr));

Und siehe da, es funktionierte. Nun hätte ich es aber lieber als HQL.
Kann mir jemand den Criterion-Code in einen HQL übersetzen?

Vielen Dank!

mfg


----------



## SlaterB (8. Jan 2007)

in der Hibernate-Konfigurationsdatei gibt es Parameter 


```
<prop key="hibernate.show_sql">false</prop>
<prop key="hibernate.format_sql">false</prop>
<prop key="hibernate.use_sql_comments">false</prop>
```
stell die mal auf true


----------



## poffi (11. Jan 2007)

Vielen Dank SlaterB für deinen Tipp!

Ich bekomme nun also den SQL zurück, der diesen Aufbau hat:



```
select … from TabelleParent parent inner join TabelleChild child on parent.childId = child.childId where …
```

Meine Übersetzung dazu sieht so aus:



```
From Parent inner join Child on Parent.child = Child
```

Dieser Query lässt sich aber nicht ausführen.

Die Ganze join-Sache macht mir schon längere Zeit Probleme. Die mageren Beispiele in der Hibernatedokumentation hilft mir hier auch nicht weiter.

Kann mir jemand weiter helfen?


----------



## MatthiasKnorr (11. Jan 2007)

Hi,

kannst du mal bitte deine *.hbm.xml für Parent und Child posten?

Grüße,
Matthias


----------



## SlaterB (11. Jan 2007)

> From Parent inner join Child on Parent.child = Child

und warum sollte das gehen? 
vielleicht gehts ja, aber mach es doch lieber wie Hibernate es macht?

->
From Parent p inner join Child c on p.child = c

das klingt doch fundamental anders und viel objektorientierter 


hilft bei deinem eigentlichen Problem aber anscheinend nicht weiter?


----------



## poffi (31. Jan 2007)

SlaterB hat gesagt.:
			
		

> hilft bei deinem eigentlichen Problem aber anscheinend nicht weiter?


Nein, nicht wirklich. Ich belasse das Ganze nun vorläufig bei der Abfrage über Criterias.
Die *.hbm.xml-Datei darf ich leider nicht posten.

Danke!


----------



## KSG9|sebastian (31. Jan 2007)

session.createQuery("from Parents p WHERE p.child.childNr = :childNr");

Die hbm's interessieren wenig. Folgende Dinge sind interessant:

-Wie heißt die Referenz auf Child in der Klasse Parent, also der VariablenName
-Wie ist das Property childNr gemappt bzw. wie heißt das Attribute in der Klasse Child ?


----------



## MatthiasKnorr (offline) (31. Jan 2007)

KSG9|sebastian hat gesagt.:
			
		

> Die hbm's interessieren wenig.


Klar, da steht ja nur das drin, nach dem du gefagt hast. ???:L 

Grüße,
Matthias


----------



## poffi (1. Feb 2007)

Folgende Zeilen stehen für die one-to-one-Beziehung zum Childobjekt im Parent-Mapping


```
<many-to-one name="child" class="*.child" not-null="true" lazy="false" unique="true">
	<column name="CHILD_ID" sql-type="smallint"/>
</many-to-one>
```

So wird das Feld childNr im Mapping der Klasse Child deklariert:

```
<property name="childNr" type="java.lang.String" column="CHILD_NR" length="20"/>
```

Helfen diese Informationen weiter?


----------



## Guest (2. Feb 2007)

Hi,

der Name der Spalte, der für die Beziehung verwendet wird, unterscheide sich.
In Parent heißt die Spalte CHILD_ID und in Child heißt sie CHILD_NR.
Wurden die hbms nicht generiert?

Grüße,
Matthias


----------



## MatthiasKnorr (offline) (2. Feb 2007)

Ach ja, ist natürlich schlecht, wenn die Namen sich unterscheiden. 

Grüße,
Matthias


----------

