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的主要内容,如果未能解决你的问题,请参考以下文章