DTO <> Entity Hibernate Spring Boot

OnDemand

Top Contributor
Hallo zusammen,

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;
    }
 

OnDemand

Top Contributor
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

Folgende Klassen hab ich

Code:
@GetMapping("/{dataName}")
    public DataDto getData(@PathVariable String dataName) {
        DataDto dataDto;
        try {
          dataDto = dataRepository.findByDataName(dataName);
        } catch (Exception ex) {
            log.error(ex.getMessage());
            return null;
        }
        return dataDto;
    }

Code:
public interface DataRepository extends CrudRepository<Data, Long> {

    DataDto findByDataName(String dataName);
}

Code:
public class DataDto implements Serializable {
    private static final long serialVersionUID = 1L;
    private String dataName;
    private boolean active;
    private String description;
}

Code:
@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "data")
public class Data {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private int id;

    @Column
    private String dataName;
   
    @Column
    private String description;

    @Column(name = "active")
    private boolean active;
}
 

OnDemand

Top Contributor
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.
 

mrBrown

Super-Moderator
Mitarbeiter
Einfacher als das?
Java:
var entity = repository.find...();
var dto = new Dto(entity.foo, entity.bar);
 

looparda

Top Contributor
holt er da nicht aber alle Daten raus erstmal?
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

Top Contributor
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.
 

OnDemand

Top Contributor
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 :D
Ich möchte unbedingt nur die Felder lesen, welche ich auch brauche
 

looparda

Top Contributor
Mit dem anderen Weg geht folgendes (getestet) und basierend auf dem Projekt aus dem Anfangs genannten Tutorial:
Java:
@Entity
public class Address {

    @Id
    private Long id;

    @OneToOne
    private Person person;
    private String state;
    private String city;
    private String street;
    private String zipCode;
}
Java:
@Value
public class AddressPartial {
    Long id;
    String zipCode;
}
Java:
@Repository
public interface AddressRepository extends CrudRepository<Address, Long> {
   @Query("select new fully.qualified.AddressPartial(a.id, a.zipCode) from Address a where a.state = :state" )
   List<AddressPartial> getAddressByState(String state);
}
Java:
@DataJpaTest
@Sql(scripts = "/projection-insert-data.sql")
@Sql(scripts = "/projection-clean-up-data.sql", executionPhase = AFTER_TEST_METHOD)
public class JpaStandardIntegrationTest {

    @Autowired
    private AddressRepository addressRepository;

    @Test
    public void whenUsingClosedProjections_thenViewWithRequiredPropertiesIsReturned() {
        AddressPartial addressPartial = addressRepository.getAddressByState("CA").get(0);

        assertThat(addressPartial.getZipCode()).isEqualTo("90001");
    }

}
Code:
Hibernate:
    select
        address0_.id as col_0_0_,
        address0_.zip_code as col_1_0_
    from
        address address0_
    where
        address0_.state=?
 

mrBrown

Super-Moderator
Mitarbeiter
@mrBrown hast du nen Link wo ich mich zu deiner Variante belesen kann? Hab mit var noch nicht mal was am Hut gehabt :D
var ist einfach nur Ersatz für den konkreten Typ, für dein Beispiel oben sind diese beiden äquivalent:

Java:
var entity = repository.find...();
var dto = new DataDto(entity.name, entity.hersteller);

Java:
Data entity = repository.find...();
DataDto dto = new DataDto(entity.name, entity.hersteller);
 

OnDemand

Top Contributor
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
 

mrBrown

Super-Moderator
Mitarbeiter
wenn ich mein DTO mit dem Namen und Hersteller holen will, muss ich die Methode findByIdNameAndHersteller nennen?
findByIdNameAndHersteller würde einem SELECT * WHERE name=? AND hersteller=? entsprechen ;)

Hab bisher immer meine Entity als Objekt genommen und die weiter gereicht. Will es nun aber mal richtig machen und verstehen
Aus dem Repository ist es auch völlig richtig, Entitys herauszureichen, DTOs nutzt man dann erst an der Netzwerkschnittstelle.
 

OnDemand

Top Contributor
Verwirrt🤓

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
 

mrBrown

Super-Moderator
Mitarbeiter
heißt also ich kann Entities innerhalb meines Programms nutzen?
Erst wenn ich was an andere Systeme gebe kann/sollte man DTO nehmen
Jap.

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.
 

OnDemand

Top Contributor
Mit dem Zugriff versteh ich nicht. Wenn ich das Objekt lade, werden die collections mir geladen. Wie sage ich dem System „ich will auch collections“

über einen anderenrepository Zugriff?
 

mrBrown

Super-Moderator
Mitarbeiter
JPA-Magie :)

Wenn deine Entität grob so aussieht:
Java:
class Entity {
     String foo;
     Collection<Bar> bars;
}

Dann wird erstmal nur das Feld foo initialisiert.

Erst wenn du auf entity.bars zugreifst, wird im Hintergrund Automatsch eine zweite SQL-Query ausgeführt, die die Collection lädt.
 

OnDemand

Top Contributor
Moin,

meine Collections sind nicht Lazy, weil ich die Entitiy an eine REST Schnittstelle liefere wo alle Daten gebraucht werden.

Da das andere System alle Daten braucht, wüsste ich nicht wie man das mit Lazy macht :rolleyes:
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Spring / Jpa / Hibernate -> java.lang.IllegalArgumentException: Unknown entity Frameworks - Spring, Play, Blade, Vaadin & Co 1
8u3631984 Ist es möglich in Spring Entity generische Listen verwenden Frameworks - Spring, Play, Blade, Vaadin & Co 3
M Spring Boot additional Datasource for a single entity Frameworks - Spring, Play, Blade, Vaadin & Co 0
M Spring Entity testen Frameworks - Spring, Play, Blade, Vaadin & Co 1
M Spring Entity testen Frameworks - Spring, Play, Blade, Vaadin & Co 5
Z JPA Extra-Entity für Many-To-Many gewissermaßen zu Fuß Frameworks - Spring, Play, Blade, Vaadin & Co 5
8u3631984 JPA - Entity dopplet inder Datenbank verhindern - UniqueConstraint scheitern aufgrund Vererbung ? Frameworks - Spring, Play, Blade, Vaadin & Co 5
8u3631984 Save Entity With List of entities Frameworks - Spring, Play, Blade, Vaadin & Co 3
L Spring Data: Detached Entity passed to persist Fehler Frameworks - Spring, Play, Blade, Vaadin & Co 6
L Spring Data: Multiple representations of the same entity Frameworks - Spring, Play, Blade, Vaadin & Co 14
L Spring JPA Entity Definierung Frameworks - Spring, Play, Blade, Vaadin & Co 0
ExceptionOfExpectation Persistierung in Hibernate(SpringBoot) Frameworks - Spring, Play, Blade, Vaadin & Co 1
padde479 org.hibernate.query.sqm.UnknownEntityException Frameworks - Spring, Play, Blade, Vaadin & Co 12
OnDemand Jasypt Hibernate 6 alternative gesucht Frameworks - Spring, Play, Blade, Vaadin & Co 3
Avalon @Query Select Abfrage liefert falsche Werte (Spring Boot, JPA, Hibernate) Frameworks - Spring, Play, Blade, Vaadin & Co 3
D org.hibernate.LazyInitializationException Frameworks - Spring, Play, Blade, Vaadin & Co 2
krgewb Hibernate - deleteByXXX Frameworks - Spring, Play, Blade, Vaadin & Co 3
Z Postgres, Hibernate Seqencenummer wird wiederholt und verursacht PK-Fehler Frameworks - Spring, Play, Blade, Vaadin & Co 3
Z JPA, Hibernate, Postgres und Sequence-Nummern Frameworks - Spring, Play, Blade, Vaadin & Co 3
Z Hibernate & Postgres in Spring Boot (Syntaxprobleme) Frameworks - Spring, Play, Blade, Vaadin & Co 2
Z Spring Boot mit JPA;, Hibernate, Rest & Lombok Frameworks - Spring, Play, Blade, Vaadin & Co 8
OnDemand Jasypt Spring Boot HIbernate wie komme ich an den Key? Frameworks - Spring, Play, Blade, Vaadin & Co 4
OnDemand Hibernate Lazy Collection löschen Frameworks - Spring, Play, Blade, Vaadin & Co 7
H Hibernate Sql Abfrage loggen Spring mit log4j.properties Frameworks - Spring, Play, Blade, Vaadin & Co 2
S Spring JPA / Hibernate: save Methode arbeitet nicht Frameworks - Spring, Play, Blade, Vaadin & Co 2
R Spring Data: Hibernate liest nicht alle Ebenen Frameworks - Spring, Play, Blade, Vaadin & Co 5
S Spring Data Hibernate mehrfache Suchkriterien Frameworks - Spring, Play, Blade, Vaadin & Co 5
H Spring Boot, Hibernate und OAuth2 wie komme ich an den User? Frameworks - Spring, Play, Blade, Vaadin & Co 13
D Spring Hibernate Struts2 ? Frameworks - Spring, Play, Blade, Vaadin & Co 1
F JPA org.hibernate.LazyInitializationException / Spring @Transactional Frameworks - Spring, Play, Blade, Vaadin & Co 5
P Spring, Hibernate und JPA in einem Projekt Frameworks - Spring, Play, Blade, Vaadin & Co 4
I Nachladen mit Hibernate und Spring Frameworks - Spring, Play, Blade, Vaadin & Co 2
N MAVEN + Spring + JPA + Hibernate + JUnit4 Frameworks - Spring, Play, Blade, Vaadin & Co 5
E Tomcat mit Hibernate und Spring - Problem mit Connection Pool Frameworks - Spring, Play, Blade, Vaadin & Co 5
P Context initialization failed - mit Spring, JPA, Hibernate Frameworks - Spring, Play, Blade, Vaadin & Co 1
B Buchempfehlung für Groovy, Spring, Hibernate, SOAP, J2EE gesucht Frameworks - Spring, Play, Blade, Vaadin & Co 1
D Hibernate - Spring Roo Frameworks - Spring, Play, Blade, Vaadin & Co 0
Dit_ Springsource Toolsuit | Hibernate intergration Frameworks - Spring, Play, Blade, Vaadin & Co 1
J Test mit Hibernate und Spring Frameworks - Spring, Play, Blade, Vaadin & Co 5
D [InvalidDataAccessApiUsageException] Spring Data JPA / Hibernate Frameworks - Spring, Play, Blade, Vaadin & Co 1
B SpringMVC-EntityManagerFactory-Hibernate-Problem Frameworks - Spring, Play, Blade, Vaadin & Co 1
M Problem mit Hibernate und Spring Frameworks - Spring, Play, Blade, Vaadin & Co 0
R Projektübergreifende Entities mit Tomcat (Spring/JPA/Hibernate) Frameworks - Spring, Play, Blade, Vaadin & Co 2
N Wie manage ich unter Spring mehrere Datenbankverbindung mit Hibernate Frameworks - Spring, Play, Blade, Vaadin & Co 6
Y Sessionmanagement (ThreadLocal) in Hibernate via Spring möglich? Frameworks - Spring, Play, Blade, Vaadin & Co 2
C Aufgabe in OSGI/Hibernate/Spring-DM Frameworks - Spring, Play, Blade, Vaadin & Co 4
dunhillone Problem mit Spring & Hibernate Sessions Frameworks - Spring, Play, Blade, Vaadin & Co 2
dunhillone Problem mit Spring & Hibernate Sessions Frameworks - Spring, Play, Blade, Vaadin & Co 2
S Hibernate und JDBC über Spring Frameworks - Spring, Play, Blade, Vaadin & Co 3
R Spring Boot Test Assertions mit Objekten Frameworks - Spring, Play, Blade, Vaadin & Co 6
8u3631984 Pfad zu Test Datei in application.yml in Spring Boot Test Frameworks - Spring, Play, Blade, Vaadin & Co 7
R Spring Boot sql Beziehungen Frameworks - Spring, Play, Blade, Vaadin & Co 12
8u3631984 Spring JPA Probleme beim SPeichern von Sets Frameworks - Spring, Play, Blade, Vaadin & Co 3
M Spring Boot 3 Datenbanken zur Laufzeit Verbinden Frameworks - Spring, Play, Blade, Vaadin & Co 5
8u3631984 Spring JDBC Probleme beim Spaltennamen Frameworks - Spring, Play, Blade, Vaadin & Co 3
LimDul Spring-Batches in Docker über Rest starten/verfolgen Frameworks - Spring, Play, Blade, Vaadin & Co 0
ExceptionOfExpectation In Meiner Spring-Boot Applikation verlangt die Datenbank Wert für eine ID Frameworks - Spring, Play, Blade, Vaadin & Co 5
H Spring Boot Applikation und JHM Benchmark sowie ContextConfiguration in H2 Tests ich bekomme es nicht hin Frameworks - Spring, Play, Blade, Vaadin & Co 2
ExceptionOfExpectation Tests in Spring-Boot Frameworks - Spring, Play, Blade, Vaadin & Co 4
R Eure Erfahrungen mit Primefaces und Spring - wer managed die Beans Frameworks - Spring, Play, Blade, Vaadin & Co 4
Avalon Get Request doppelt abfeuern ohne Post Redirect Get Pattern. Spring Boot Thymeleaf MVC Frameworks - Spring, Play, Blade, Vaadin & Co 12
thor_norsk Konfigurationsprobleme mit Spring Boot Frameworks - Spring, Play, Blade, Vaadin & Co 9
R Spring Boot Integration-testing mit Keycloak Frameworks - Spring, Play, Blade, Vaadin & Co 1
R Spring Boot Integration-testing mit Keycloak Frameworks - Spring, Play, Blade, Vaadin & Co 13
L Spring Data und Rest Controller? Frameworks - Spring, Play, Blade, Vaadin & Co 4
thor_norsk Spring Boot Fehler Frameworks - Spring, Play, Blade, Vaadin & Co 1
L Spring Data und Rest Conroller? Frameworks - Spring, Play, Blade, Vaadin & Co 4
thor_norsk Spring Boot und Docker Frameworks - Spring, Play, Blade, Vaadin & Co 5
B Spring Amazon-SP-Api Frameworks - Spring, Play, Blade, Vaadin & Co 3
8u3631984 Aktualisiere Spring Controller Frameworks - Spring, Play, Blade, Vaadin & Co 4
L Spring Data: Modellierung mit einer Embeddable bean Frameworks - Spring, Play, Blade, Vaadin & Co 2
D Spring Boot Test ob Validation geprüft wurde Frameworks - Spring, Play, Blade, Vaadin & Co 8
K Spring Boot OneToMany Frameworks - Spring, Play, Blade, Vaadin & Co 6
8u3631984 Spring Boot Docker Image erstellen und mit docker-compose konfigurieren Frameworks - Spring, Play, Blade, Vaadin & Co 1
M Wann Spring Batch nutzen? Frameworks - Spring, Play, Blade, Vaadin & Co 1
P Spring Hessian Remote Beispiel Frameworks - Spring, Play, Blade, Vaadin & Co 20
8u3631984 Spring 2.7.8 Info Enpoint nicht zuerreichen Frameworks - Spring, Play, Blade, Vaadin & Co 1
gradlew.bat spring-boot:run funktioniert nicht Frameworks - Spring, Play, Blade, Vaadin & Co 4
Zrebna Spring Boot/Thymeleaf: Bestätigungsemail senden. Frameworks - Spring, Play, Blade, Vaadin & Co 2
Zrebna Spring - Thymeleaf: Wieso wird gem. Fallunterscheidung entsprechende View nicht geladen? Frameworks - Spring, Play, Blade, Vaadin & Co 3
Dimax Spring UsernameNotFoundException(msg); auf der View msg ausdrücken Frameworks - Spring, Play, Blade, Vaadin & Co 1
Dimax Spring UsernameNotFoundException(Message) auf der View Message ausdrücken Frameworks - Spring, Play, Blade, Vaadin & Co 2
B Spring Boot und JPA Error creating bean Frameworks - Spring, Play, Blade, Vaadin & Co 24
R Spring Security: Wie kommt 'UserDetails' an Username und Passwort ran? Frameworks - Spring, Play, Blade, Vaadin & Co 6
R Spring Security: Wie den User dynamisch authentifizieren? Frameworks - Spring, Play, Blade, Vaadin & Co 8
R Spring Security: Authentication & Permissions Frameworks - Spring, Play, Blade, Vaadin & Co 4
R Spring Boot: Warum soll PasswordEncoder in einer neuen Methode definiert sein? Frameworks - Spring, Play, Blade, Vaadin & Co 1
8u3631984 Cross-Origin beim Abrufen von Spring Endpoint Frameworks - Spring, Play, Blade, Vaadin & Co 1
D Spring Boot und Microservices Frameworks - Spring, Play, Blade, Vaadin & Co 1
T Spring Resourcen Ordner ermitteln Frameworks - Spring, Play, Blade, Vaadin & Co 5
B Spring JPA und Repository Frameworks - Spring, Play, Blade, Vaadin & Co 12
D Mapstruct Dependency Injection funktioniert nicht mit Spring Frameworks - Spring, Play, Blade, Vaadin & Co 15
Avalon Wie sieht bei Euch das Deployment einer Spring Boot Anwendung aus? Frameworks - Spring, Play, Blade, Vaadin & Co 4
M Threads in Spring Boot Frameworks - Spring, Play, Blade, Vaadin & Co 7
W DI-Problem in Spring Boot Frameworks - Spring, Play, Blade, Vaadin & Co 4
T Spring Boot: Was bewirkt parent in maven genau? Frameworks - Spring, Play, Blade, Vaadin & Co 4
T Spring Security: Run-as replacement Einsatzbereich? Frameworks - Spring, Play, Blade, Vaadin & Co 1
OnDemand Vaadin+Spring Boot erster Seitenload nach Neustart endlos Frameworks - Spring, Play, Blade, Vaadin & Co 0
doncarlito87 Wie erhalte ich ein JSON aus eine NativeQuery (Spring Boot)? Frameworks - Spring, Play, Blade, Vaadin & Co 8
Avalon Erstellung Dockerimage mit spring-boot:build-image in Spring Boot mit Umgebungsvariablen Frameworks - Spring, Play, Blade, Vaadin & Co 0

Ähnliche Java Themen

Neue Themen


Oben