angenommen ich hab unten stehende Entity (mit wesentlich mehr Feldern) und möchte unter gewissen Umständen nur den Namen und Hersteller aus der DB. Dazu hab ich ein passendes DTO welches nur die beiden Felder hat.
Wie bekomme ich das DTO mit nur den Daten befüllt ohne das gesamte "Data" zu hlen und Data zu Dto zu mappen
sowie
ohne @Query(SELECT new DataDto(d.name, d.hersteller) From....)
Gibt es da keine elegantere Möglichkeit?
Code:
@Entity
@Table(name = "data")
public class Data {
@EmbeddedId
private ProductId id;
@Column
private String name;
@Column
private String beschreibung;
@Column
private String hersteller;
}
Danke, hab es mal mit dem Class Based versucht, aber bekomme eine No converter found capable of converting from type to Type Fehlermeldung
Irgendwas hab ich vergessen oder Spring Boot macht mir einen Strich durch die Rechnung. Kann das vielleicht an den Lombokannotationen liegen? Der baut die hash und equals automatisch
Upps die hab ich hier vergessen rein zu kopieren. Hatte vorher noch @NoArgsConstructor damit gehts nicht. Wenn ich @NoArgsConstructor entferne, gehts 😳
Find das so einfacher zu mappen als im Query zu wurschteln.
Komm drauf an wie du deine Methoden im Repository schreibst. Prinzipiell verschiebst du damit meiner Meinung nach aber das "Problem" der partiellen Datenabfrage ins Repository und darfst da manuell Queries schreiben ala @Query("SELECT foo, bar FROM entity"). Kann man aber auch so machen. Es gibt viele Wege mit jeweils Vor- und Nachteilen.
@looparda wie ich es verstehe, holt dein Vorschlag NICHT alle Daten raus, sondern nur die wie ich sie im DTO angegeben habe oder verstehe ich was falsch?
Meine letzte Antwort galt deiner Frage zu mrBrown's Vorschlag. Spring Data Projections fragen nur die Felder ab, die du in deiner Projection definierst ("holt dein Vorschlag NICHT alle Daten raus"). Und nochmal: Durch manuelles Mapping kannst du dies auch erreichen, aber musst dann eben die Repository-Methoden selbst schreiben aber kommst auch zum Ziel.
Am besten probierst du beide Wege aus und entscheidest dich dann.
Ich habe Projections ausprobiert, auf die erzeugten SQL-Abfragen geschaut und es schein so, dass entgegen meiner Annahme alle Felder der Entity geladen werden, sobald man einen nicht-primitiven Datentyp in der Entity hat.
Danke, Collection hab ich grad keine, aber wird sicher vorkommen. @mrBrown hast du nen Link wo ich mich zu deiner Variante belesen kann? Hab mit var noch nicht mal was am Hut gehabt
Ich möchte unbedingt nur die Felder lesen, welche ich auch brauche
@RepositorypublicinterfaceAddressRepositoryextendsCrudRepository<Address,Long>{@Query("select new fully.qualified.AddressPartial(a.id, a.zipCode) from Address a where a.state = :state")List<AddressPartial>getAddressByState(String state);}
Muss nochmal blöd fragen, bin unterwegs und da kam mir noch was.
wenn ich mein DTO mit dem Namen und Hersteller holen will, muss ich die Methode findByIdNameAndHersteller nennen?
🧐
Hab bisher immer meine Entity als Objekt genommen und die weiter gereicht. Will es nun aber mal richtig machen und verstehen
Die Methodennamen-Syntax, aus der Spring Data die SQL-Query ableitet gilt nicht mehr, sobald du die Query selbst mit [USER=22313]@Query[/USER] vorgibst. Es ist also dann egal, wie du die Methode nennen magst.
heißt also ich kann Entities innerhalb meines Programms nutzen?
Erst wenn ich was an andere Systeme gebe kann/sollte man DTO nehmen
Oder auch hier: ich möchte ein Objekt holen welches mehrere collections hat die ich aber nicht brauche.
dafür ein DTO mit den nötigen Feldern bauen oder wäre auch hier ausreichend die entity mittels Query zu „beschneiden“ Und im Query im select das wählen was ich brauche?
hab nämlich noch einen Fall da holt es mit jedesmal die collections raus die ich an der Stelle nicht brauche und daher ewig dauert.
An andere Stelle brauch ich die collections aber
Oder auch hier: ich möchte ein Objekt holen welches mehrere collections hat die ich aber nicht brauche.
dafür ein DTO mit den nötigen Feldern bauen oder wäre auch hier ausreichend die entity mittels Query zu „beschneiden“ Und im Query im select das wählen was ich brauche?
hab nämlich noch einen Fall da holt es mit jedesmal die collections raus die ich an der Stelle nicht brauche und daher ewig dauert.
An andere Stelle brauch ich die collections aber
Die Collections sind doch hoffentlich Lazy? Dann sollten die ersten bei Zugriff geladen werden - wenn du sie nicht nutzt, werden sie auch nicht geladen.