# JPA: Wie sieht der select aus?



## JavaCat++ (30. Mrz 2017)

Folgendes SQL-Skript:

```
create table Konto (
kontoid number (03) Primary key,
kontonummer number,
betrag number (12,2)
);

create table Girokonto (
kontoid number (3) primary key,
dispoKredit number (12,2)

);
```

Die Klassen sehen wie folgt aus:



```
@Entity

@Inheritance(strategy = InheritanceType.JOINED)

public class Konto implements Serializable, Comparable <Konto>{

@Id
private long kontoid;
private long Kontonummer;
private double betrag;

@ManyToOne()
@JoinColumn(name = "bankid")
private Bank bank;
[...]
```


```
@Entity

@NamedQueries (

public class Girokonto extends Konto{

private double dispoKredit;
[...]
```

Nun meine Frage: Wie sieht der JPQL-Befehl aus, wenn ich mir ein Girokonto-Objekt ziehen will und der Nutzer dafür die Kontonummer eingeben muss. Konto und Girokonto sind ja über die bankid verknüpft, aber irgendwie komme ich gerade nicht auf die Lösung.
Vielen Dank!


----------



## Thallius (30. Mrz 2017)

Tue dir einen Gefallen und rechne niemals mit double wenn du ein genaues Ergebnis erwartest. Rechne mit Cent oder noch besser mit 1/100 Cent. Dann brauchst du keine Kommastelle bei Geldbeträgen.

Gruß

Claus


----------



## StarSheriff (31. Mrz 2017)

```
Query query = entityManager.createQuery("Select g from Girokonto g, Konto k where g.kontoid = k.kontoid and k.kontonummer =: kontonummer");
query.setParameter("kontornummer", kontoNummerEingabeDurchNutzer);
```

Ich möchte aber an dieser Stelle betonen, dass ich das Datenbankmodell mit den Tabellen Konto und Girokonto sehr fragwürdig finde. Laut diesem können die beiden auch nicht über die bankid verknüpft sein, da beide Tabellen dieses Attribut/Spalte gar nicht haben, ich geh davon aus du  meintest kontoid.

Spendier der DB-Tabelle Konto ne Spalte FK_KONTO_TYP, mach ne neue Tabelle KONTO_TYP (+Klasse KontoTyp im JavaCode), leg da den Eintrag Girokonto an. Das 1:1 Abbildung von Vererbung von Java-Klassen auf Datenbanktabellen halt ich für nicht sinnvoll.

Du kannst dann immer noch im Java-Code eine eigene Klassen Girokonto verwenden wenn du das möchtest, ich würde einfach ne Enum zur Verwaltung des Typs bauen.


```
public enum KontoTypEnum {
GIROKONTO(1);
private long id;

private KontoTypEnum(long id){
this.id = id;
}
public long getId(){
return this.id;
}
}
```

Die zugehörige Query würde dann wiefolgt aussehen:

```
Query query = entityManager.createQuery("Select k from Konto k where k.kontoTyp.id =: kontoTyp and k.kontonummer =: kontonummer");
query.setParameter("kontoTyp", KontoTypEnum.GIROKONTO.getId());
query.setParameter("kontonummer", kontoNummerEingabeDurchNutzer);
```


----------

