Hibernate version: 3.0.5
Name and version of the database: Pervasive.SQL 7
Liebe Spezialisten!
Wir wollen/müssen Hibernate mit einer SQL-Datenbank verwenden, die eine nicht standard-konforme Syntax für SELECT ... UNION ... erwartet.
Unsere Hibernate-Mappings enthalten ein
union-subclass Mapping, das von Hibernate wie folgt übersetzt wird (der Übersicht halber gekürzt und wichtige Schlüsselwörter groß geschrieben):
Code:
SELECT abstractsa0_.AuftrNr as AuftrNr0_, abstractsa0_.VK_Stelle as VK2_13_0_, ..., abstractsa0_.clazz_ as clazz_0_
FROM ( SELECT Anrede, KndCode, Zusatz, ..., 1 as clazz_ FROM Auftragskopf UNION SELECT Anrede, KndCode, Zusatz, ..., 2 as clazz_ FROM ImpKopf )
abstractsa0_ WHERE abstractsa0_.AuftrNr=?
Pervasive 7 erlaubt leider keine UNION-subselects, so dass wir die WHERE-Klausel in jedem UNION-Select wiederholen müssten. Das Statement müsste für Pervasive in etwa so aussehen:
Code:
SELECT AuftrNr as AuftrNr0_, VK_Stelle as VK2_13_0_, ..., 1 as clazz_
FROM Auftragskopf ak1 WHERE ak1.AuftrNr=?
UNION SELECT AuftrNr, VK_Stelle, ..., 2 as clazz_ FROM ImpKopf ak2 WHERE ak2.AuftrNr=?
In den Hibernate-Sourcen haben wir gesehen, dass die SQL-Statements an verschiedenen Stellen zusammen gesetzt werden. Das Prinzip ist jedoch immer das gleiche: Es wird eine org.hibernate.sql.Select Instanz erzeugt und mit Werten gefüllt, die der Persister liefert (in unserem Fall org.hibernate.persister.entity.UnionSubclassEntityPersister).
Um die Struktur der Statements zu beeinflussen, müssten wir an allen Stellen, an denen ein SELECT-Statement von Hibernate gebaut wird, eingreifen und außerdem die Parameterzuweisung abfangen, um jeden Parameterwert in jedes an der UNION beteiligte SELECT einzutragen.
Gibt es vielleicht noch einen anderen Punkt in Hibernate, an dem wir ansetzen könnten, um unser Problem zu lösen?
Zur Info: Wir haben bereits viele Möglichkeiten zur Umgehung des Problems ausprobiert aber keine Alternative gefunden (z.B. alternative Mappings, ein spezieller Persister, Erzeugung eines Views in der Datenbank etc.). Außerdem haben wir auch keine Möglichkeit, Pervasive durch eine vernünftige SQL-Datenbank zu ersetzen, weil eine alte Anwendung auf Pervasive 7 angewiesen ist.
Danke!