# Hibernate: Query verarbeiten



## Donke5 (1. Jun 2010)

Hallo,
ich habe eine MySQL-DB, in der ich über Hibernate Kunden und Aufträge speichern will.
Das anlegen der Daten funktioniert einwandfrei, nur beim rausholen von Daten aus der DB habe ich Probleme.
Die Tabelle Kunde hat als Felder nur id (Primärschlüssel), Name und Adresse.

So sieht meine Methode getKunde aus:

```
public static void getKunde() {
        kundenListe.clear();
        Session session = InitSessionFactory.getInstance().getCurrentSession();
        Transaction tx = session.beginTransaction();
        Query query = session.createQuery("from Kunde where id = 1");
        List<Kunde> list = query.list();
        java.util.Iterator<Kunde> iter = list.iterator();
        while (iter.hasNext()) {
            Kunde kunde = new Kunde();            
            kunde = list.get(0);
            kundenListe.add(kunde);
        }
        tx.commit();        
    }
```

Dazu muss ich sagen, dass ich bis vor 2 Wochen keinerlei Erfahrung mit Datenbanken in Verbindung mit Java hatte. Ich muss das für ein Testat in Verbindung mit einer Java-Vorlesung machen. Da muss ich mich jede Woche in ein neues Thema einarbeiten.
Sehe ich das überhaupt richtig, dass das Ergebnis der query als Objekt der Klasse Kunde in der liste "list" gespeichert wird?


----------



## SlaterB (1. Jun 2010)

dein Problem hat ziemlich wenig mit einer DB zu tun, vielleicht wird dir hier alles etwas klarer,

versuche folgendes Programm zu verbessern (bisher Endlosschleife),
schau dir in einem Buch den Umgang mit Listen, Iteratoren an?

```
public class Test {
    public static void main(String[] args)  {
        List<String> kundenListe = new ArrayList<String>();
        kundenListe.clear();
        List<String> list = loadKunden();
        java.util.Iterator<String> iter = list.iterator();
        while (iter.hasNext())  {
            System.out.println("schleifendurchlauf");
            String kunde = null;
            kunde = list.get(0);
            kundenListe.add(kunde);
        }
        System.out.println("kundenListe: "+kundenListe);
    }
    public static List<String> loadKunden()  {
        List<String> l = new ArrayList<String>();
        l.add("John");
        l.add("Rambo");
        return l;
    }
}
```


----------



## maki (1. Jun 2010)

```
Kunde kunde = new Kunde();            
            kunde = list.get(0);
            kundenListe.add(kunde);
```
Wozu soll die erste Zeile gut sein?
Erst ein Objekt anlegen und dann die Referenz darauf auf ein anderes setzen?


----------



## Donke5 (1. Jun 2010)

SlaterB hat gesagt.:


> dein Problem hat ziemlich wenig mit einer DB zu tun, vielleicht wird dir hier alles etwas klarer,
> 
> versuche folgendes Programm zu verbessern (bisher Endlosschleife),
> schau dir in einem Buch den Umgang mit Listen, Iteratoren an?


Wenn ich das richtig verstehe lege ich in Zeile 7 einen Iterator an, der die gleiche Länge hat wie meine Liste aus Zeile 6, in der die Ergebnisse aus der Query gespeichert sind.
Warum kann ich dann aber nicht einfach eine for-Schleife nehmen, die ich mit list.length durchlaufen lasse? Oder gleich für query.list().size()?

Deine Klasse Test verstehe ich nicht so richtig. Soweit ich das sehe wird der Iterator doch die Länge 1 haben und damit die Schleife einmal durchlaufen!


```
public static void getKunde() {
        kundenListe.clear();
        Session session = InitSessionFactory.getInstance().getCurrentSession();
        Transaction tx = session.beginTransaction();
        Query query = session.createQuery("from Kunde where id = 1");
        List<Kunde> list = query.list();
        java.util.Iterator<Kunde> iter = list.iterator();
        while (iter.hasNext()) {            
            kundenListe.add(iter.next());
        }
        tx.commit();        
    }
```

@maku: Stimmt, die Zeile ist sinnlos. So wie ich es oben habe funktioniert es jetzt.


----------



## SlaterB (1. Jun 2010)

Iteratoren haben keine Längen oder size, ihre Funktionsweise hängt aber sicherlich von der Größe der zugehörigen Liste ab, richtig

aber jetzt hast du ja auch iter.next() drin, ohne diesem Aufruf geht gar nix bei Iteratoren,
was war nun noch die offene Frage?

> Warum kann ich dann aber nicht einfach eine for-Schleife nehmen, die ich mit list.length durchlaufen lasse? 

wer verbietet das?
query.uniqueResult() geht hier gar noch besser ohne jede Liste

> Sehe ich das überhaupt richtig, dass das Ergebnis der query als Objekt der Klasse Kunde in der liste "list" gespeichert wird? 

richtig


----------



## Donke5 (1. Jun 2010)

SlaterB hat gesagt.:


> was war nun noch die offene Frage?


In dem Zusammenhang keine.
Vielen Dank für die Hilfe damit.

Jetzt habe ich nur noch ein Problem:
Wenn ich Daten speichere, die Gui beende, neu Starte und eine Query ausführe sind alle meine Daten aus der DB gelöscht!
Woran kann das liegen?


----------



## SlaterB (1. Jun 2010)

entweder kein Commit beim Speichern oder ein Löschen zwischendurch,
mit separaten DB-Tool und Beobachtung zwischendurch zumindest das entweder/ oder zu unterscheiden


----------



## Donke5 (1. Jun 2010)

SlaterB hat gesagt.:


> entweder kein Commit beim Speichern oder ein Löschen zwischendurch,
> mit separaten DB-Tool und Beobachtung zwischendurch zumindest das entweder/ oder zu unterscheiden



Hier meine Methode zum Speichern:


```
public static Kunde createKunde(String name, String adresse) {
        Kunde kunde1 = new Kunde();
        kunde1.setName(name);
        kunde1.setAdresse(adresse);
        Session session = InitSessionFactory.getInstance().getCurrentSession();
        Transaction tx = session.beginTransaction();        
        session.saveOrUpdate(kunde1);
        tx.commit();
        return kunde1;
    }
```

Wenn der Code oben richtig ist wüsste ich nicht wo ich die Daten sonst lösche.
Es wird übrigens nicht beim Beenden gelöscht, sondern wenn ich eine neue Abfrage (from) starte.


----------



## Gelöschtes Mitglied 5909 (1. Jun 2010)

Notiz am Rande: 

Wieso machst du bei einem Select eine Transaktion auf?

Das hat mit Java nix zu tun


----------



## Donke5 (1. Jun 2010)

raiL hat gesagt.:


> Notiz am Rande:
> 
> Wieso machst du bei einem Select eine Transaktion auf?
> 
> Das hat mit Java nix zu tun



Hmm keine Ahnung. Das Thema mit den Transaktionen und Sessions hab ich eh noch nicht so richtig verstanden...
Das Problem ist, dass ich vor 2 Monaten in der Vorlesung ohne Programmiererfahrung mit Java angefangen habe. 
Und da wir jede Woche eine Aufgabe machen müssen muss ich schauen, dass ich die zeitlich auf die Reihe bekomme.
Meiner Meinung nach zieht das Niveau so schnell an, da habe ich einfach nicht die Zeit dazu mich immer gut in ein Thema einzuarbeiten.
Bei dem Hibernate-Thema z.B. habe ich einfach ein Hibernate-Tut genommen und es für meinen Bedarf umgebaut.
Jedenfalls habe ich das Probiert.
Deswegen: Ich probiere mich ohne viel Hintergrundwissen an dem Thema... 
Am Sonntagabend wartet ja schon das nächste...


----------



## Gelöschtes Mitglied 5909 (1. Jun 2010)

Nach zwei Monaten ohne Programmiererfahrung gleich Hibernate machen zu müssen ist schon heftig. Dann drück ich dir mal die Daumen, hoffe du bist nicht allzu gefrustet und dann wird das schon mit der Zeit


----------



## Donke5 (1. Jun 2010)

Danke. Auch für die Geduld hier. 
Ich habe vor in den Semesterferien (nach der Prüfung in Programmieren) mal ein Java-Buch durchzuarbeiten. Vielleicht mache ich mich dann auch nochmal an das Thema Hibernate ran.
Ich hasse es einfach an was zu arbeiten ohne das Hintergrundwissen zu haben...


----------

