# Library zum Generieren von SQL-Statements



## Gast (8. Apr 2008)

Hallo!

Ich suche eine Java-Library, die einen auf eine Datenbank angepassten SQL-String generiert. D.h. heißt es sollte Methoden wie addWhereClause(...), addLeftJoin(...) geben, mit denen man das SQL-Statement aufbauen kann. Weiters sollte man noch die Datenbank, für die das SQL Statement generiert werden soll, angeben können.

Kennt jemand eventuell so eine Library?


----------



## tuxedo (8. Apr 2008)

Ich glaub fast nicht dass es sowas gibt. Damit wäre man sicher auch etwas eingeschränkt was die flexibilität und komplexität von Statements betrifft. 

Ich nehme an du willst mit so einer Lib die unterschiedlichen SQL-Dialekte und Eigenheiten auf einen gemeinsamen Nenner bringen?
Ich stell jetzt einfach mal so in den Raum, dass die Unterschiede in den einzelnen Sprachfeatures einer DB zu unterschiedlich sind um sowas zu realisisieren. Denn sonst gäbe es vermutlich auch schon einen "universellen" JDBC Treiber der mit allen Datenbanken kann und den man mit einem vereinheitlichenten SQL-Dialekt füttert.

- Alex


----------



## maki (8. Apr 2008)

Hibernate generiert SQL passend zur DB, kannst die SQL Statements aber nicht direkt verwenden, das macht Hibernate intern.

Heutzutage sollte man sowieso kein JDBC mehr verwenden wenn man Anwendungen neu entwickelt, viel zu "low level".
ORM Framework wie eben Hibernate sind da viel besser, der Standard dazu ist JPA.


----------



## Guest (8. Apr 2008)

Hallo!

Erstmal vielen Dank für die Antworten. Wir verwenden grundsätzlich JDO als OR-Mapper (ist ein älteres Projekt). Das Problem ist aber, daß wir für bestimmte Auswertungen sehr komplexe SQL-Statements brauchen, wo wir mit den JDO-Mitteln nicht mehr weiterkommen. Deshalb würden wir in diesen Fällen ein SQL-Statement über ein JDODirectSqlQuery absetzen. 

Allerdings bleibt eben das Problem mit dem (DB unabhängigen) Zusammenbau des Statements.


----------



## maki (8. Apr 2008)

Welche Version von JDO?

JDO2.0 soll der JPA in vielen Bereichen überlegen sein.

Ansonmmsten stimme ich dir zu, die DB Unabhängigkeit ginge so verloren.


----------



## byte (8. Apr 2008)

alex0801 hat gesagt.:
			
		

> Ich glaub fast nicht dass es sowas gibt. Damit wäre man sicher auch etwas eingeschränkt was die flexibilität und komplexität von Statements betrifft.


Klar gibts das.



> Ich nehme an du willst mit so einer Lib die unterschiedlichen SQL-Dialekte und Eigenheiten auf einen gemeinsamen Nenner bringen?
> Ich stell jetzt einfach mal so in den Raum, dass die Unterschiede in den einzelnen Sprachfeatures einer DB zu unterschiedlich sind um sowas zu realisisieren. Denn sonst gäbe es vermutlich auch schon einen "universellen" JDBC Treiber der mit allen Datenbanken kann und den man mit einem vereinheitlichenten SQL-Dialekt füttert.


Warum sollte sich jemand die Mühe machen, einen generischen DB-Treiber zu schreiben? Jeder DB-Hersteller stellt doch JDBC-Treiber für Ihre DB bereit. Den Entwickler interessiert doch eigentlich herzlich wenig, was unterhalb von JDBC passiert.


----------



## Guest (8. Apr 2008)

maki hat gesagt.:
			
		

> Welche Version von JDO?
> 
> JDO2.0 soll der JPA in vielen Bereichen überlegen sein.
> 
> Ansonmmsten stimme ich dir zu, die DB Unabhängigkeit ginge so verloren.



JDO 1.0, leider!


----------



## balko (9. Apr 2008)

byto hat gesagt.:
			
		

> Klar gibts das.



Was gibt es denn da? 

Ich bräuchte das automatische Generieren von SQL Statements für folgenden Anwendungsfall. Ich stopfe Daten aus Excel in ein Java-Objekt. Dieses Java-Objekt, welches im wesentlichen die ExcelTabellenDaten enthält möchte ich dann in eine bestimmte bereits existierende Datenbanktabelle schreiben. 

Hibernate scheidet in diesem Fall also meiner Meinung nach aus, da die Struktur der Datenbanktabellen bereits vorgegeben ist.

Eine Idee?


----------



## tuxedo (9. Apr 2008)

Mit iBatis lässt sich das bewerkstelligen. Zumindest das Mapping. Wenn du die DB wechselst, musst du nur den JDBC wechseln und passende Mappings bereitstellen. Automatisch wird allerdings kein SQL-Statement geformt.

- Alex


----------



## balko (9. Apr 2008)

Mir geht es insbesondere um das automatische erstellen von SQL-Statements. NICHT um das Mapping. 

Beispielsweise möchte ich eine Methode haben, der ich eine Referenz auf eine SQL-Tabelle und einzufügende Daten (bspw. als Array oder Liste) übergebe und die dann ein passende SQL-Statements generiert.


----------



## ms (9. Apr 2008)

balko hat gesagt.:
			
		

> Hibernate scheidet in diesem Fall also meiner Meinung nach aus, da die Struktur der Datenbanktabellen bereits vorgegeben ist.


Das ist kein Grund. Du kannst auch Hibernate mit vorhandener Tabellenstruktur verwenden.
Gibt ja genug Reverseengeneering-Tools mit denen du aus vorhandenen Tabellen/Relationen die Hibernatekonfiguration und die Mappingfiles generieren kannst.

Andere Frage: Ist dies eine einmalige Aufgabe (Datenmigration) oder soll das regelmäßig durchgeführt werden? Und wie viele Tabellen gibt es und gibt es Relationen? 
Falls es was einmaliges ist, würde es nicht reichen im Excel eine Spalte neben den Daten anhand einer Formel dir ein Insert-Statement zu schreiben und für alle Datenzeilen einfach runterkopieren?

ms


----------



## balko (9. Apr 2008)

ms hat gesagt.:
			
		

> balko hat gesagt.:
> 
> 
> 
> ...



Das ist natürlich eine gute Idee. Kannst du da ein Tool empfehlen?



			
				ms hat gesagt.:
			
		

> Andere Frage: Ist dies eine einmalige Aufgabe (Datenmigration) oder soll das regelmäßig durchgeführt werden? Und wie viele Tabellen gibt es und gibt es Relationen?



Nein es wird sich bei den Excel files um Daten handeln die sehr häufig neu in die Datenbank geladen werden müssen. 


Danke schonmal für die Hilfe!


----------



## ms (9. Apr 2008)

balko hat gesagt.:
			
		

> Kannst du da ein Tool empfehlen?


Schau mal hier: http://www.hibernate.org/255.html

ms


----------



## byte (9. Apr 2008)

balko hat gesagt.:
			
		

> Mir geht es insbesondere um das automatische erstellen von SQL-Statements. NICHT um das Mapping.
> 
> Beispielsweise möchte ich eine Methode haben, der ich eine Referenz auf eine SQL-Tabelle und einzufügende Daten (bspw. als Array oder Liste) übergebe und die dann ein passende SQL-Statements generiert.


SQL zu Java-Objekten generieren ohne ein Mapping zu einem bestehenden DB-Schema anzugeben, ist wohl unmöglich. Oder soll die Library vielleicht raten, wo die Daten evtl. hingehören könnten? :roll:


----------



## balko (14. Apr 2008)

Danke für den Hinweis auf HibernateTools. Kann ich nur empfehlen!

Ich habe noch eine Frage zum persistieren von Objekte mit Hibernate. Wenn man nur ein Objekt hat, kann man ja 


```
session.save(object);
```

benutzen. Welchen Befehl kann ich benutzen, wenn ich eine Sammlung (Liste, Set, Array...) von Objekten habe? ...natürlich wäre es möglich mit einer Schleife mehrmals den save-Befehl aufzurufen, aber dann wird immer ein neues SQL-Statement erzeugt und das dauert dann ziemlich lange...


Jemand eine Idee?

MfG
ein balko


----------



## byte (14. Apr 2008)

http://www.hibernate.org/hib_docs/reference/en/html/batch.html


----------

