# Hibernate Entitäten bei Selects aus 2 Tabellen



## nieselfriem (19. Nov 2020)

Hallo,

ich habe ein wenig ein Verständnisproblem bei Hibernate bzw bei ORM allgemein. Wenn ich eine Selection von einer Tabelle mache wie z.B. ich will alle Rechnungen haben die größer sind als 5000 €. Dann mache ich in etwa das hier.


```
Query query = session.createQuery("from rechnung where betrag > 5000");
```
Somit bekomme ich ein Rechnungsobjekt(e) zurück und alles ist fein und ich kann damit arbeiten.

Wie läuft das bei SQL Anfragen in etwa wie dieser:


```
SELECT r.id, r.rechnungsNummer, r.datum, r.betrag, f.name FROM rechnung r, firma f WHERE
r.firma_id = f.id
```


Hier habe ich ja Daten aus zwei Entitäten. Wie wird dann "gemappt" und was bekomme ich da für ein Objekt zurück?

VG Georg


----------



## Oneixee5 (19. Nov 2020)

Du kannst mit SqlResultSetMapping arbeiten, z.B.: https://www.baeldung.com/jpa-sql-resultset-mapping


----------



## Thallius (19. Nov 2020)

nieselfriem hat gesagt.:


> Hallo,
> 
> ich habe ein wenig ein Verständnisproblem bei Hibernate bzw bei ORM allgemein. Wenn ich eine Selection von einer Tabelle mache wie z.B. ich will alle Rechnungen haben die größer sind als 5000 €. Dann mache ich in etwa das hier.
> 
> ...



es ist übrigens eine Unsitte einen join so zu schreiben. Man sollte immer richtig joinen damit auch klar ist welchen join typ man erwartet


----------



## LimDul (19. Nov 2020)

nieselfriem hat gesagt.:


> Hallo,
> 
> ich habe ein wenig ein Verständnisproblem bei Hibernate bzw bei ORM allgemein. Wenn ich eine Selection von einer Tabelle mache wie z.B. ich will alle Rechnungen haben die größer sind als 5000 €. Dann mache ich in etwa das hier.
> 
> ...


Warum nicht einfach nur die Rechnungen selektieren? Die haben ja die Firma eh als Attribut.


----------



## nieselfriem (19. Nov 2020)

Oneixee5 hat gesagt.:


> Du kannst mit SqlResultSetMapping arbeiten, z.B.: https://www.baeldung.com/jpa-sql-resultset-mapping


OK. ich habe es im ansatz verstanden was da gemacht wird. Nur leider bin ich offenbar zu doof um herauszufinden wo ich dieses Mapping definiere, so dass es gefunden wird. Kommt es in die Funktion, die das Quer ausführt, kommt es in eine extra Klasse. Das habe ich bisher noch nicht raus gefunden.

folgendes geht nicht:. Da meckert die IDE gleich, dass es hier nicht hin gehört

```
public class TolleKlasse {
   public void Methode() {
      @SqlResultSetMapping(
            name="supermapping"

      )
   }
}
```

hier meckert die IDE nicht aber beim ausführen von Hibernate bekomme ich den Fehler Unknown SqlResultSetMapping [RechnungFirmaMapping]

```
@SqlResultSetMapping(
       name="supermapping"

      )
public class TolleKlasse {
   public void Methode() {

   }
}
```

Mein erstelltes Mapping sieht bisher so aus.


```
@SqlResultSetMapping(
        name="RechnungFirmaMapping",
        entities = {
                @EntityResult(
                        entityClass = Firma.class,
                        fields = {
                                @FieldResult(name="name", column = "name")
                        }
                ),
                @EntityResult(
                        entityClass = Rechnung.class,
                        fields = {
                                @FieldResult(name="id", column = "id"),
                                @FieldResult(name="name", column = "name"),
                                @FieldResult(name="rechnungsNummer", column = "rechnungsNummer"),
                                @FieldResult(name="datum", column = "datum"),
                                @FieldResult(name="betrag", column = "betrag"),
                        }
                ),
        }
)
```

Da es sich um Annotation handelt müsste es ja wahrscheinlichen eine der Entity-Klassen gehören. Falls dem so ist nur die Frage, in die der Rechnung oder der Firma.
Bin etwas konfus. Ein vollständiges Beispiel wo man mal den ganzen Code sehen könnte wäre schon cool. Ich habe bisher nur Anleitungen mit einzelnen Codefragmenten gefunden. 

Vielen Dank für die Mühe

VG Georg


----------



## Oneixee5 (20. Nov 2020)

Eigentlich ist das gar nicht so schwer. Ich würde das SqlResultSetMapping dort definieren, wo auch die Query definiert ist, welche das SqlResultSetMapping verwenden soll. Beim SqlResultSetMapping gibt es sehr viele Möglichkeiten. Diese alle hier zu erklären würde den hier verfügbaren Rahmen sprengen. Hier kann dir auch keiner abnehmen die Dokumentation zu durchforsten. Dir muss erst mal klar sein wie dein(e) Zielobjekt(e) aussehen sollen, danach richtet sich das Mapping. Dein Zielobjekt muss dabei nicht zwingen von einer Entity-Klasse sein. Willst du mehrere Objekte per SqlResultSetMapping erzeugen (also in einer Row) ist der Rückabetyp Object[], darin sind dann deine Mappingtypen enthalten.


----------



## Oneixee5 (20. Nov 2020)

LimDul hat gesagt.:


> Warum nicht einfach nur die Rechnungen selektieren? Die haben ja die Firma eh als Attribut.


Das ist nicht immer eine gute Idee, evtl. werden dann 2 Abfragen ausgeführt wenn die Firma abgefragt wird. Möglicherweise eignet sich das Object für Rechnungen auch nicht als DTO. Über die Gründe für das Vorgehen kann hier nur spekuliert werden, diese sind auch nicht Bestandteil der Frage.


----------



## LimDul (20. Nov 2020)

Oneixee5 hat gesagt.:


> Das ist nicht immer eine gute Idee, evtl. werden dann 2 Abfragen ausgeführt wenn die Firma abgefragt wird. Möglicherweise eignet sich das Object für Rechnungen auch nicht als DTO. Über die Gründe für das Vorgehen kann hier nur spekuliert werden, diese sind auch nicht Bestandteil der Frage.


Wenn ich immer nur die Fragen beantworten würde, die gestellt werden - wäre ich kein guter Entwickler. Den (und da deutet die Frage drauf hin), ist der Thread-Ersteller nicht der Experte. Ob das eine gute Lösung ist - weiß ich nicht. Aber man sollte sie kennen.


----------

