Hibernate Property-Problem

Cola_Colin

Top Contributor
Hi,

folgendes Szenario:
Gegeben sei eine Klasse A, die per Hibernate auf eine Datenbanktabelle gemappt ist.
Diese Klasse A hat ein Feld, das auf eine Klasse B zeigt, welche ein Feld hat, was auf Klasse C zeigt.
Nun möchste ich von A auf C zugreifen. In der DB sind die Verknüpfungen über die IDs vorhanden, die von Hibernate umgesetzt werden.

Genauer versuche ich dieses Propertyobjekt für A zu erzeugen:

Java:
Property.forName("B").getProperty("C");

Dies resultiert aber nur in dieser Exception:
org.hibernate.QueryException: could not resolve property: order.damageObject

Wie komme ich an C ran ?
Im Endeffekt, will ich überprüfen, ob C in dem Ergebnis von einem subquery vorhanden ist.

Mein Ziel ist es also soetwas machen zu können:

wähle alle A, bei denen C vorkommt in der Auswahl aller C, für die eine Bedingung gilt.

Hilfe ???:L
 
hast du dir alle Tutorial-Beispiele angeschaut bzw. überhaupt schon 1000 Criterias um alle Grundfunktionen mitzubekommen? 😉

Chapter 15. Criteria Queries
15.4. Associations

By navigating associations using createCriteria() you can specify constraints upon related entities:

List cats = sess.createCriteria(Cat.class)
.add( Restrictions.like("name", "F%") )
.createCriteria("kittens")
.add( Restrictions.like("name", "F%") )
.list();

The second createCriteria() returns a new instance of Criteria that refers to the elements of the kittens collection.

There is also an alternate form that is useful in certain circumstances:

List cats = sess.createCriteria(Cat.class)
.createAlias("kittens", "kt")
.createAlias("mate", "mt")
.add( Restrictions.eqProperty("kt.name", "mt.name") )
.list();

(createAlias() does not create a new instance of Criteria.)
usw?

ansonsten benenne dein Problem doch bitte in SQL oder HQL oder in exakten Beispielen, aus
> wähle alle A, bei denen C vorkommt in der Auswahl aller C, für die eine Bedingung gilt.
werde ich nicht schlau
 
Ich habe gerade einen SQL-Ausdruck gebaut, der zurückliefert, was ich will:

select * from A where '28001125' = (select number from C where C_id = (select C_id from B where B_id = A.B_id))

Hintergrund ist dieser:

Ich baue an einem Such/Filter System. Dieses zeigt eine Tabelle, die aus verschiedenen Tabellen zusammengefügt wird.
Die Suche hat zwei Varianten, bei einer kann man jede Spalte einzeln Filtern. Jede Spaltung ist also eine Bedingung, alle werden mit und verknüfpt. Da konnte ich einfach das .add(Criterion) aus deinem Beispiel verwenden.

Beim zweiten kann man einfach einen String eingeben, ist es z.B. eine Zahl, so sollen alle Spalten durchsucht werden, die Zahlen enthalten. Hierbei müssen die Bedingungen mit or verknüpft werden.
Dieses or kriege ich mit createCriteria().add aber nicht hin (oder doch ?!).

Meine Lösung sieht nun vor, ein einzelnes Criterion auf der Grundklasse zu machen, die auf alles weitere verweist und dieses aus den Unterbedingungen aufzubauen, die eben mit and oder mit or verknüpft werden.

Nur um dieses Criterion auf der Grundklasse aufzubauen, muss ich eben von der Grundklasse A auf B auf C zugreifen.
 
das wäre dann gleichbedeutend mit

[sql]
select * from A a, B b, C c
where a.bid = b.bid and b.cid = c.cid
and c.number = '28001125'
[/sql]
abgesehen von möglichen zu vielen Ausgaben, Mehrfachjoins?

in HQL dann möglicherweise
[sql]
select a from A a where a.bEntity.cEntity.number = '28001125'
[/sql]
?

wieso Criteria bei sowas eine Alternative darstellen werde ich nie verstehen,
ich bin da übrigens kein Experte, aber rate gerne,
dies könnte funktionieren:

Java:
        List list = getSession().createCriteria(A.class)
                .createCriteria("bEntity")
                .createAlias("cEntitiy", "c")
                .add(Restrictions.eqProperty("c.number", ...)).list();
nur mit alias kann man anscheinend nur auf direkte Properties von A zugreifen,
mit createCriteria("bEntity") scheint sich alles dahinter dann aber auf bEntity zu beziehen,

gibt sicher noch schönere Varianten, z.B. erstmal ein Criteria für B zusammenbauen und das irgendwie später bei A einfügen
 
SlaterB hat gesagt.:
wieso Criteria bei sowas eine Alternative darstellen werde ich nie verstehen,
Ich denke, das liegt daran, dass HQL für einen Java-Programmierer immer noch zu sehr nach SQL aussieht und man mit der Criteria-API die (durch die Dokumentationen geförderte) Illusion hat, mit pure Java zu arbeiten. Was aber schnell absurd ist, wenn man sich den resultierenden Java-Code mit den ganzen Strings anschaut.

Bei fest definierten Abfragekriterien (so wie hier) macht meiner Erfahrung nach ein HQL-Query immer mehr Sinn als ein Criteria-Query. Criteria-Queries setze ich nur bei einer variablen Anzahl von Suchparametern ein, bei denen nicht alle belegt sein müssen (also null sein können).
 

Zurück
Oben