Spring Boot 查询 DTO

Posted

技术标签:

【中文标题】Spring Boot 查询 DTO【英文标题】:SpringBoot Query DTO 【发布时间】:2021-02-10 05:14:10 【问题描述】:

感谢我的 DTO 类,我希望检索数据库中包含的信息。 问题是,如果我不理解原因,我的查询就无法工作......

来自数据库的实体

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


我的查询:

@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();

我的目标是让这个查询正常工作:)

如果你认为你有比解决这个问题更好的主意,请告诉我! 谢谢

【问题讨论】:

这能回答你的问题吗? Validation failed for query for method JPQL @RobertBain 我想使用新的运算符。我觉得有可能 当您提供错误消息时,人们可以更好地帮助您。例如,Diego Pinto 发布了一个非常好的答案,如果您提供了错误,该答案可能会被保存。 从一开始就提供了错误。在“我的查询块”中:// 问题在这里 【参考方案1】:

您的 HistoriqueDeploiement 实体缺少@Entity:

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

... the rest of the class

没有那个标签 Spring-boot ORM 不知道这个类代表一个实体,也不能对其进行查询。

Here 你可以在文档中找到关于@Entity 标签的解释:

Customer类用@Entity注解,表示它是一个JPA实体。 (因为不存在@Table注解,所以假设这个实体映射到一个名为Customer的表。)

【讨论】:

我没有复制整个文件,它已经在那里了。我更新了我的帖子【参考方案2】:

我这边的解决方案就是这个!

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;
    

【讨论】:

以上是关于Spring Boot 查询 DTO的主要内容,如果未能解决你的问题,请参考以下文章

GraphQL Spring-boot 查询过滤

在Spring Boot中使用Spring-data-jpa实现分页查询(转)

Spring Boot H2数据库新增修改查询删除

Spring Boot 查询 DTO

使用spring-boot在Jpa查询中出错

spring boot mongodb 模糊查询,开启事务,获取mongoclient 方法