Was ich beschreiben werde, ist ein Stück Legacy-Code. Es gibt also eine Menge Dinge, die ich nicht anfassen/ändern kann.
Dieser Pseudocode läuft gut in Jboss 4.0.3,
big_messy_sql = "select t1.f1 as somealias, t2.f2 as somehthingelse from obj1 t1, obj2 t2 where crazy_conditions....";
Query query = entityManager.createNativeQuery(big_messy_sql);
List<Object> results = query.getResultList();
for (Object oRow : results) {
Object[] r = (Object[]) oRow;
// Do more crazy stuff
}
Also, es funktioniert.
Jetzt versuche ich, den Jboss-Server auf 5.1.0GA zu aktualisieren, was eine aktuellere Version von hibernate verwenden wird
15:39:02,089 INFO [Version] Hibernate Annotations 3.4.0.GA
15:39:02,167 INFO [Environment] Hibernate 3.3.2.GA
15:39:02,183 INFO [Environment] hibernate.properties not found
15:39:02,198 INFO [Environment] Bytecode provider name : javassist
15:39:02,198 INFO [Environment] using JDK 1.4 java.sql.Timestamp handling
15:39:02,495 INFO [Version] Hibernate Commons Annotations 3.1.0.GA
15:39:02,511 INFO [Version] Hibernate EntityManager 3.4.0.GA
Dann erhielt ich diese Ausnahme:
12:06:09,031 INFO [BigDecimalType] could not read column value from result set: id; S0022: Invalid column name 'id'.
Ich glaube, es liegt daran, dass diese Version von Hibernate versucht, die Ergebnismenge in die Klasse obj1 bzw. obj2 abzubilden. Diese Java-Klassen werden an anderer Stelle in dieser Anwendung über JPA ordnungsgemäß aus der Datenbank abgerufen (d. h. wir haben alle @Entity, @Table und @Column usw. auf die Klassen obj1 und obj2 angewendet). Da die id-Spalten in dieser chaotischen Abfrage einem anderen Alias zugeordnet sind, ist der ORM fehlgeschlagen.
Jetzt kommt meine Frage:
Kann ich die automatische Zuordnung der nativen Abfrage irgendwo deaktivieren?
Ich möchte vermeiden, dass ich mir die Mühe mache, ein SQL-Mapping für dieses chaotische Ungetüm zu definieren.