简体   繁体   中英

SpringBoot Query DTO

I wish to retrieve the information contained in the database thanks to my DTO class. The problem is that my query doesn't work without me understanding why...

Entity from database

@Entity
@Table(name = "historiquedeploiement")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class HistoriqueDeploiement {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;    

    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name = "idnamespace", nullable = false)    
    @JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id")
    @JsonIdentityReference(alwaysAsId=true)
    @JsonProperty("idnamespace")
    private Namespace namespace;

    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name = "idservice", nullable = false)    
    @JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id")
    @JsonIdentityReference(alwaysAsId=true)
    @JsonProperty("idservice")
    private Service service;

    @NotEmpty
    @Size(max = 100)
    private String tagvalue;
}

DTO :

@Data
@NoArgsConstructor
@AllArgsConstructor
public class HistoriqueDeploiementReadingDTO {
        
        private Integer id;

        @NotEmpty
        private String namespacename;

        @NotEmpty
        private String servicename;
        
        @NotEmpty
        private String tagvalue;

}

My Query :

@Repository
public interface HistoriqueDeploiementRepository extends JpaRepository<HistoriqueDeploiement, Integer> {        
    List<HistoriqueDeploiement> findAll();

// Problem Here 
Error creating bean with name 'historiqueDeploiementRepository': FactoryBean threw exception on object creation; nested exception is java.lang.IllegalArgumentException: Validation failed for query for method public abstract java.util.List com.example.jpa.repository.HistoriqueDeploiementRepository.findAllDeploiement()!


    @Query("SELECT new com.example.jpa.dto.HistoriqueDeploiementReadingDTO(historiquedeploiement.id, namespace.namespacename, service.servicename, historiquedeploiement.tagvalue) FROM historiquedeploiement, namespace, service WHERE namespace.id = historiquedeploiement.idnamespace and service.id = historiquedeploiement.idservice")

    List<HistoriqueDeploiementReadingDTO> findAllDeploiement();
}

My goal is to have this query working :)

If you think you have a better idea than solving this problem let me know ! Thanks

Your HistoriqueDeploiement entity is missing the @Entity:

@Entity
public class HistoriqueDeploiement {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;    

... the rest of the class
}

Without that tag Spring-boot ORM does not know that the class represents an entity and can't perform queries on it.

Here you can find the explanation on the docs about the @Entity tag:

The Customer class is annotated with @Entity, indicating that it is a JPA entity. (Because no @Table annotation exists, it is assumed that this entity is mapped to a table named Customer.)

The solution that is working on my side is this one !

package com.example.jpa.services.historiquedeploiement;

import java.util.List;
import java.util.stream.Collectors;

import org.modelmapper.ModelMapper;
import org.modelmapper.convention.MatchingStrategies;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Service;

import com.example.jpa.repository.HistoriqueDeploiementRepository;
import com.example.jpa.dto.HistoriqueDeploiementReadingDTO;
import com.example.jpa.model.HistoriqueDeploiement;
@Service
@Configuration
public class MapService {

    @Autowired
    private HistoriqueDeploiementRepository historiqueDeploiementRepository;
    
    @Autowired
    private ModelMapper modelMapper;
    
    @Bean
    public ModelMapper modelMapper() {
       ModelMapper modelMapper = new ModelMapper();
       return modelMapper;
    }
    
    public List<HistoriqueDeploiementReadingDTO> getAllHistorique() {
       return ((List<HistoriqueDeploiement>) historiqueDeploiementRepository
                .findAll())
                .stream()
                .map(this::convertToHistoriqueDeploiementReadingDTO)
                .collect(Collectors.toList());
    }

    private HistoriqueDeploiementReadingDTO convertToHistoriqueDeploiementReadingDTO(HistoriqueDeploiement historiqueDeploiement) { 
        modelMapper.getConfiguration()
                .setMatchingStrategy(MatchingStrategies.LOOSE);
        HistoriqueDeploiementReadingDTO historiqueDeploiementReadingDTO = modelMapper
                .map(historiqueDeploiement, HistoriqueDeploiementReadingDTO.class); 
        return historiqueDeploiementReadingDTO;
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM