# Datenbankeinträge vergleichen



## Casio (23. Mai 2016)

Also folgendes Problem:

Ich hab eine DB in der ich eine KundenId und eine KartenId speichere, dabei kann jeder Kunde nur eine KundenId besitzen, er kann aber mehrere KartenId's registrieren für sich. Ich würde nun gern eine Klasse schreiben, die nur dazu gedacht ist anhand der KartenId mir die KundenId zurückzugeben. Das beste wäre in dem Fall natürlich ich würde das irgendwie Objekt gebunden regeln können also irgendwie evtl mit dem entityManager und der find()-Methode ? Aber natürlich würd ich auch jegliche andere vorschläge annehmen über SQL-queries.


Leider ist mein Wissen nicht besonders groß im Bereich der Datenbanken


----------



## KaffeeFan (23. Mai 2016)

Stehen KundenId und KartenId in einer Tabelle, oder in zwei?
Wenn in zwei; in welcher Relation stehen sie zueinander?

Objektgebunden könntest du es mit "Entity Classes from Database" realisieren.

Gruß
Luk


----------



## Casio (23. Mai 2016)

beides ist in einer Tabelle, also die einzigen Ansätze die ich da hab sind halt leider über Queries ich weiß nicht evtl. gehts auch nicht anders aber selbst mit JPQL-queries tu ich mir schwer ich hab folgenden Ansatz bisher:


```
public List<CustomerMapping> findCustomerId(String cardId) {
        return em.createQuery(
             "SELECT c FROM Customer c WHERE c.cardId LIKE :cardId")
             .setParameter("cardId", cardId)
             .getResultList();
         }
```

das hier wird aber auf keinen Fall funktionieren oder? Wichtig ist mir vor allem, das es so dynamisch wie möglich codiert ist, weil ich später über die UI genau diese eingabe von der cardId als httpRequest reinbekomme es darf also nicht hardcordiert sein a la "such mal nach der kartennummer 23123" sondern eher "such mal nach *referenzvariabel*"

Mein Wissen in Datenbanken geht quasi gegen 0, ich hab mich da etwas eingelesen und Tutorials gesehen dazu dennoch tu ich mir sehr schwer damit. Vor allem sind die Tutorials natürlich alle auf einem sehr niedrigen Niveau und was ich hier verlange ist glaub ich wesentlich komplexer.


----------



## KaffeeFan (23. Mai 2016)

Setze deinen Code bitte in Zukunt in die dafür vorgesehenen Codetags.



Casio hat gesagt.:


> public List<CustomerMapping> findCustomerId(String cardId) {
> return em.createQuery(
> "SELECT c FROM Customer c WHERE c.cardId LIKE :cardId")
> .setParameter("cardId", cardId)
> ...



Doch, das sollte so funktionieren. Oder tut es das bei dir nicht?

Gruß
Luk


----------



## Casio (23. Mai 2016)

Dann hab ich wohl was falsch verstanden, was spuckt mir diese createQuery aus? Sagt die mir jetzt nun die customerId zu der folgende cardId ? Das wäre ja perfekt


----------



## Joose (23. Mai 2016)

Du bekommst alle Kunden zurück welche diese Kartennummer haben. Sprich wenn eine Karte nur einem Kunden gehören kann, dann bekommst du nur diesen zurück. (aber alle Informationen der Kundentabelle nicht nur die ID)


----------



## Casio (24. Mai 2016)

Joose danke dass du mithilfst, die KundenId und die KartenId sind beide in der gleichen Tabelle weil das eben bei dir etwas komisch klang.

mit alle Informationen meinst du quasi alle aus der Reihe sprich ich hab vier Spalten Name,KundenId,KartenId,Bank und diese Methode spuckt mir anhand der KartenId eben Name,KundenID und Bank aus oder?

dem könnte ich mit folgendem Code entgegenwirken:

public CustomerMappin findCustomerId(String cardId) {
        return em.createQuery(
             "SELECT c FROM Customer c WHERE c.cardId LIKE :cardId")
             .setParameter("cardId", cardId)
             .getSingleResult();
         }


----------



## KaffeeFan (24. Mai 2016)

"select c" heißt soviel wie, "select *" , sprich hole alles aus der Spalte.
Würdest du "select c.cardId" schreiben, würdest du nur die cardId zurückbekommen.

Gruß
Lukk


----------



## Casio (24. Mai 2016)

okay jetzt ist der Groschen gefallen das bedeutet wenn ich die CustomerID haben will wo die cardId die gleiche ist wie meine referenzvariabel cardId (ich will das ganze so dynamisch wie möglich programmieren da cardId aus einem httpRequest kommt) dann muss das ganze so aussehen:

public CustomerMappin findCustomerId(String cardId) {
return em.createQuery(
"SELECT c.customerId FROM Customer c WHERE c.cardId LIKE :cardId")
.setParameter("cardId", cardId)
.getSingleResult();
}


----------



## KaffeeFan (24. Mai 2016)

Ich weiß nicht was "CustomerMappin" darstellt und ob das mit dem return dann so hinhaut, aber der Rest stimmt.

Gruß
Lukk


----------



## stg (25. Mai 2016)

Übrigens: http://sysout.be/2011/03/09/why-you-should-never-use-getsingleresult-in-jpa/


----------



## Casio (25. Mai 2016)

schon gelesen, hier erwarte ich aber nur einen Eintrag, da wäre es doch idiotisch eine ganze Liste zurück zu bekommen


----------



## stg (25. Mai 2016)

Und wenn kein Eintrag gefunden wird, erwartest du dann eine Exception?
getSingleResult sollte man wirklich nur verwenden, wenn wirklich sichergestellt ist, dass exakt ein Ergebnis zurückgeliefert wird, wie z.B. bei manchen count-Abfragen.
Aber das steht ja auch alles in dem Artikel, muss ich also nicht weiter ausführen


----------



## max40 (25. Mai 2016)

Casio hat gesagt.:


> schon gelesen, hier erwarte ich aber nur einen Eintrag, da wäre es doch idiotisch eine ganze Liste zurück zu bekommen


Dann hast du es nicht richtig gelesen, es geht darum, das man getSingleResult() nur benutzen soll wenn man definitiv 1 Eintrag zurückbekommt. Denn wenn dein Query kein Daten findet, weil z.B. die übergebene cardId nicht vorhanden ist, erhälst du eine unchecked exception. Und das möchte man nicht.


----------



## Casio (25. Mai 2016)

das heißt ich änder das alles wieder auf eine ResultList um auch den Rückgabewert dementsprechend auf List<CustomerMapping>
der gibt mir dann die customerId zurück ich hab nur noch nicht ganz die Logik bei so einem Query mit dem EntityManager verstanden
gibt mir diese em.createQuery() Methode dann genau das was dort steht zurück und wenn ich das ganze was ich da zurück bekomm gern speichern würde in die Referenzvariabel customerId123 kann ich dann das einfach so :

public List<CustomerMappin> findCustomerId(String cardId) {
return customerId123 = em.createQuery(
"SELECT c.customerId FROM Customer c WHERE c.cardId LIKE :cardId")
.setParameter("cardId", cardId)
.getResultList();
}


----------



## stg (25. Mai 2016)

Nein. `createQuery` gibt ein Objekt zurück, welches das Query Interface implementiert und `getResultList` liefert wie der Name schon vermuten lässt eine Liste. 
Außerdem findest du in dem von mir geposteten Artikel auch entsprechende Code-Schnipsel. Hast du dir den Artikel überhaupt durchgelesen?
Vielleicht festigst du besser erstmal deine Grundlagen-Kenntnise bevor du dich an fortgeschrittenere Thenen wie JPA wagst. Da bestehen offenbar noch einige Lücken.


----------



## Casio (25. Mai 2016)

Ja habe ich Chef! 
Ich versteh nur nicht so ganz wie ich im Debugger überprüfen soll was in dieser Liste drin ist(wird zwar eh nur ein Wert sein aber gut) 

also ich such damit doch die customerID zu der entsprechenden cardID wieso kann ich im debugging-Modus dann nicht genau diese Liste sehen wenn über getResultList oder halt getSingleResult gehe


----------

