春季启动查询DTO

huangapple go评论120阅读模式
英文:

SpringBoot Query DTO

问题

我希望通过我的DTO类从数据库中检索信息。
问题是,我的查询不起作用,我不知道为什么...

数据库实体:

  1. @Entity
  2. @Table(name = "historiquedeploiement")
  3. @Data
  4. @NoArgsConstructor
  5. @AllArgsConstructor
  6. public class HistoriqueDeploiement {
  7. @Id
  8. @GeneratedValue(strategy = GenerationType.IDENTITY)
  9. private Integer id;
  10. @ManyToOne(fetch = FetchType.LAZY, optional = false)
  11. @JoinColumn(name = "idnamespace", nullable = false)
  12. @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
  13. @JsonIdentityReference(alwaysAsId = true)
  14. @JsonProperty("idnamespace")
  15. private Namespace namespace;
  16. @ManyToOne(fetch = FetchType.LAZY, optional = false)
  17. @JoinColumn(name = "idservice", nullable = false)
  18. @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
  19. @JsonIdentityReference(alwaysAsId = true)
  20. @JsonProperty("idservice")
  21. private Service service;
  22. @NotEmpty
  23. @Size(max = 100)
  24. private String tagvalue;
  25. }

DTO类:

  1. @Data
  2. @NoArgsConstructor
  3. @AllArgsConstructor
  4. public class HistoriqueDeploiementReadingDTO {
  5. private Integer id;
  6. @NotEmpty
  7. private String namespacename;
  8. @NotEmpty
  9. private String servicename;
  10. @NotEmpty
  11. private String tagvalue;
  12. }

我的查询:

  1. @Repository
  2. public interface HistoriqueDeploiementRepository extends JpaRepository<HistoriqueDeploiement, Integer> {
  3. List<HistoriqueDeploiement> findAll();
  4. @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")
  5. List<HistoriqueDeploiementReadingDTO> findAllDeploiement();
  6. }

我的目标是使这个查询起作用 春季启动查询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

  1. @Entity
  2. @Table(name = &quot;historiquedeploiement&quot;)
  3. @Data
  4. @NoArgsConstructor
  5. @AllArgsConstructor
  6. public class HistoriqueDeploiement {
  7. @Id
  8. @GeneratedValue(strategy = GenerationType.IDENTITY)
  9. private Integer id;
  10. @ManyToOne(fetch = FetchType.LAZY, optional = false)
  11. @JoinColumn(name = &quot;idnamespace&quot;, nullable = false)
  12. @JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property=&quot;id&quot;)
  13. @JsonIdentityReference(alwaysAsId=true)
  14. @JsonProperty(&quot;idnamespace&quot;)
  15. private Namespace namespace;
  16. @ManyToOne(fetch = FetchType.LAZY, optional = false)
  17. @JoinColumn(name = &quot;idservice&quot;, nullable = false)
  18. @JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property=&quot;id&quot;)
  19. @JsonIdentityReference(alwaysAsId=true)
  20. @JsonProperty(&quot;idservice&quot;)
  21. private Service service;
  22. @NotEmpty
  23. @Size(max = 100)
  24. private String tagvalue;
  25. }

DTO :

  1. @Data
  2. @NoArgsConstructor
  3. @AllArgsConstructor
  4. public class HistoriqueDeploiementReadingDTO {
  5. private Integer id;
  6. @NotEmpty
  7. private String namespacename;
  8. @NotEmpty
  9. private String servicename;
  10. @NotEmpty
  11. private String tagvalue;
  12. }

My Query :

  1. @Repository
  2. public interface HistoriqueDeploiementRepository extends JpaRepository&lt;HistoriqueDeploiement, Integer&gt; {
  3. List&lt;HistoriqueDeploiement&gt; findAll();
  4. // Problem Here
  5. Error creating bean with name &#39;historiqueDeploiementRepository&#39;: 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()!
  6. @Query(&quot;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&quot;)
  7. List&lt;HistoriqueDeploiementReadingDTO&gt; findAllDeploiement();
  8. }

My goal is to have this query working 春季启动查询DTO

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

答案1

得分: 0

您的HistoriqueDeploiement实体缺少@Entity注解:

  1. @Entity
  2. public class HistoriqueDeploiement {
  3. @Id
  4. @GeneratedValue(strategy = GenerationType.IDENTITY)
  5. private Integer id;
  6. ... 类的其余部分
  7. }

如果没有这个标签,Spring Boot ORM将无法识别该类表示一个实体,并且无法在其上执行查询。

您可以在这里找到关于@Entity标签的文档解释:

> Customer类被注解为@Entity,表示它是一个JPA实体。(因为没有@Table注解,假定此实体被映射到名为Customer的表。)

英文:

Your HistoriqueDeploiement entity is missing the @Entity:

  1. @Entity
  2. public class HistoriqueDeploiement {
  3. @Id
  4. @GeneratedValue(strategy = GenerationType.IDENTITY)
  5. private Integer id;
  6. ... the rest of the class
  7. }

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.)

答案2

得分: 0

以下是翻译好的代码部分:

  1. package com.example.jpa.services.historiquedeploiement;
  2. import java.util.List;
  3. import java.util.stream.Collectors;
  4. import org.modelmapper.ModelMapper;
  5. import org.modelmapper.convention.MatchingStrategies;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.context.annotation.Bean;
  8. import org.springframework.context.annotation.Configuration;
  9. import org.springframework.stereotype.Service;
  10. import com.example.jpa.repository.HistoriqueDeploiementRepository;
  11. import com.example.jpa.dto.HistoriqueDeploiementReadingDTO;
  12. import com.example.jpa.model.HistoriqueDeploiement;
  13. @Service
  14. @Configuration
  15. public class MapService {
  16. @Autowired
  17. private HistoriqueDeploiementRepository historiqueDeploiementRepository;
  18. @Autowired
  19. private ModelMapper modelMapper;
  20. @Bean
  21. public ModelMapper modelMapper() {
  22. ModelMapper modelMapper = new ModelMapper();
  23. return modelMapper;
  24. }
  25. public List<HistoriqueDeploiementReadingDTO> getAllHistorique() {
  26. return ((List<HistoriqueDeploiement>) historiqueDeploiementRepository
  27. .findAll())
  28. .stream()
  29. .map(this::convertToHistoriqueDeploiementReadingDTO)
  30. .collect(Collectors.toList());
  31. }
  32. private HistoriqueDeploiementReadingDTO convertToHistoriqueDeploiementReadingDTO(HistoriqueDeploiement historiqueDeploiement) {
  33. modelMapper.getConfiguration()
  34. .setMatchingStrategy(MatchingStrategies.LOOSE);
  35. HistoriqueDeploiementReadingDTO historiqueDeploiementReadingDTO = modelMapper
  36. .map(historiqueDeploiement, HistoriqueDeploiementReadingDTO.class);
  37. return historiqueDeploiementReadingDTO;
  38. }
  39. }
英文:

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

  1. package com.example.jpa.services.historiquedeploiement;
  2. import java.util.List;
  3. import java.util.stream.Collectors;
  4. import org.modelmapper.ModelMapper;
  5. import org.modelmapper.convention.MatchingStrategies;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.context.annotation.Bean;
  8. import org.springframework.context.annotation.Configuration;
  9. import org.springframework.stereotype.Service;
  10. import com.example.jpa.repository.HistoriqueDeploiementRepository;
  11. import com.example.jpa.dto.HistoriqueDeploiementReadingDTO;
  12. import com.example.jpa.model.HistoriqueDeploiement;
  13. @Service
  14. @Configuration
  15. public class MapService {
  16. @Autowired
  17. private HistoriqueDeploiementRepository historiqueDeploiementRepository;
  18. @Autowired
  19. private ModelMapper modelMapper;
  20. @Bean
  21. public ModelMapper modelMapper() {
  22. ModelMapper modelMapper = new ModelMapper();
  23. return modelMapper;
  24. }
  25. public List&lt;HistoriqueDeploiementReadingDTO&gt; getAllHistorique() {
  26. return ((List&lt;HistoriqueDeploiement&gt;) historiqueDeploiementRepository
  27. .findAll())
  28. .stream()
  29. .map(this::convertToHistoriqueDeploiementReadingDTO)
  30. .collect(Collectors.toList());
  31. }
  32. private HistoriqueDeploiementReadingDTO convertToHistoriqueDeploiementReadingDTO(HistoriqueDeploiement historiqueDeploiement) {
  33. modelMapper.getConfiguration()
  34. .setMatchingStrategy(MatchingStrategies.LOOSE);
  35. HistoriqueDeploiementReadingDTO historiqueDeploiementReadingDTO = modelMapper
  36. .map(historiqueDeploiement, HistoriqueDeploiementReadingDTO.class);
  37. return historiqueDeploiementReadingDTO;
  38. }
  39. }

huangapple
  • 本文由 发表于 2020年10月28日 04:47:51
  • 转载请务必保留本文链接:https://go.coder-hub.com/64562675.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定