# DB auslesen (Hibernate, Query, Parameter)



## Hoerti (17. Jun 2010)

Hallo zusammen! 

Ich habe ein Problem, an dem ich schon lange dranhänge. Und zwar habe ich in der DB eine Tabelle "Test" mit den Spalten "id, vorname, nachname". Momentan, da dies alles nur für Testzwecke ist, hat die Tabelle nur einen Eintrag
Die Namedquery lautet wie folgt: 


```
@NamedQuery(name = "test.holealles", query="Select c from Test c")
```
So, mein Ziel ist es, den Vorname anzeigen zu lassen. Also habe ich eine statische Funktion geschrieben: 

```
public static Test getVorname(String nachname){
        EntityManager em = JpaUtil.getEntityManager();
        return (Test) em.createNamedQuery("test.holealles").setParameter("nachname", nachname).getSingleResult();
    }

Als Fehler erhielt ich hierbei: 

 You have attempted to set a parameter value using a name of nachname that does not exist in the query string Select c from Test c.
```



Mit .getResultList hab ichs auch scho versucht. Wenn ich die Liste aber dann ausgeben lasse, bekomme ich nur die id. 


Wo liegt da denn der Fehler??


----------



## SlaterB (17. Jun 2010)

hmm, vergleichen wir es mit einem anderen Problem:
du weißt ungefähr wie man mit Hammer, Säge und Co. umgehst, hast aus einem Baumstamm schon ein handliches Stück Holz gemacht, 
was durchaus ein großer Teil der Arbeit ist,

und nun versuchst du deinen Hamster in den Holz-Käftig zu setzen, was nicht funktioniert, da dieser immer noch nur ein Stück Holz ist..

--------

wenn du nach Nachname filtern willst, dann musst du die Query auch entsprechend formulieren
"Select c from Test c where c.nachname = :nachname"


----------



## Hoerti (17. Jun 2010)

Erstens einmal: was genau macht where c.nachname = :nachname?

Vergleicht das die Variable nachname mit der Spalte in der DB? Wenn ja, in der Variable steht ja garnichts drinnen, die will ich mir ja holen....

Zweites: Funktioniert so auch nicht, bekomme folgenden Fehler:


```
You have attempted to set a parameter value using a name of nachname that does not exist in the query string Select c from Test c where c.vorname = :vorname.
```


----------



## Eldorado (17. Jun 2010)

Hast du dir mal ein Tutorial für Hibernate durchgelesen? 
Wenn ja, wie sieht dein Mapping(alternative Annotations in der Klasse) und die Klasse aus, die die Datenbanktabelle repräsentiert(Test?)?


----------



## Hoerti (17. Jun 2010)

Nein, mit Hibernate habe ich mich nicht auseinandergesetzt.

Dies ist die Klasse: 


```
@NamedQuery(name = "test.holealles", query="Select c from Test c where c.vorname = :vorname")
@Entity
public class Test implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String vorname;
    private String nachname;

 
    public Test(){
         EntityManager em = JpaUtil.getEntityManager();

        Test t = getVorname(nachname);

        System.out.println(getVorname());
        
      //  for(Object o : namen){
      //      System.out.println(namen);
      //  }
        em.close();
    }

    public String getNachname() {
        return nachname;
    }

    public String getVorname() {
        return vorname;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
    }
    public static Test getVorname(String nachname){
        EntityManager em = JpaUtil.getEntityManager();
        return (Test) em.createNamedQuery("test.holealles").setParameter("nachname", nachname).getSingleResult();
    }
    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Test)) {
            return false;
        }
        Test other = (Test) object;
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "test.Test[id=" + id + "]";
    }

}
```


----------



## SlaterB (17. Jun 2010)

ich sage dir dass du :nachname in die Query schreiben sollst und du fügst :vorname ein
und wunderst dich dann, dass Hibernate sagt, dass es keinen Parameter nachname finden kann?

der SELECT-Teil bestimmt, was gelesen wird, dort kannst du vielleicht auf Vorname einschränken, wenn du nur den Vornamen brauchst,
der WHERE-Teil schränkt die Ergebnissmenge ein, wenn du einen bestimmten Nachnamen suchst, dann such auch danach

aber ich will kaum alle SQL-Grundlagen hier erklären, du solltest vielleicht erstmal ohne Hibernate reines SQL üben


----------



## Hoerti (17. Jun 2010)

Reines Sql hatte ich ein Semester lang, danke  
Nur in der Java-Umgebung ist mir das ganze noch etwas fremd.


Ok, ich habe jetzt nachname versucht. Nun heißt es: 


```
getSingleResult() did not retrieve any entities.
```

Das heißt, er findet keinen Nachnamen, oder wie? 
Komisch... hier mal meine Tabelle Test:

ID                     VORNAME              NACHNAME             
---------------------- -------------------- -------------------- 
1                      Max                      Mustermann


----------



## SlaterB (17. Jun 2010)

tja, wer weiß was du da machst, falscher Name, falscher Query-Aufbau (noch nicht neu gepostet),
keine Daten in der DB weil Abfrage zu früh (vor dem Einfügen), zu spät (schon wieder weg) oder in sonst einer Lücke,

da hilft nur ein umfassender Test:

in einer Methode direkt hintereinander:
- String nachname = ..;
- nachname ausgeben
- einzelnes Objekt suchen und ausgeben ob vorhanden
- ALLE Objekte laden, im selben Context, der nächst Befehl direkt dahinter, nichmal unterschiedliche Methoden, ausgeben,
- ALLE Objekte in einer Liste durchlaufen, jeweils Nachname mit dem eigenen Suchnamen vergleichen (equals)

wenn unter ALLEN Objekten einer mit dem gleichen Namen ist, dann wäre es langsam verwunderlich,
dann möglichst viel Code zu dem vollständigen Test posten


----------



## Hoerti (17. Jun 2010)

Ok danke, werde ich jetzt einmal versuchen. 
Kann aber dauern, wenn ich mir das so ansehe


----------

