当前位置: 首页 > 知识库问答 >
问题:

Spring jpa存储库返回实体类而不是dto接口

微生啸
2023-03-14

我在后端代码中使用了Spring数据jpa。我已经包含了实体,dto接口,服务和jpa存储库代码。

现在的问题是,当我在< code>TopicService中调用< code>getAllTopics()时。它返回< code>Topic对象的列表,而不是< code>TopicDto。< code>Topic对象包含一个< code >示例列表,我没有将它包含在< code>TopicDto中。并且< code>Topic对象还包括一个< code>Comment对象列表,而不是< code > Comment tdo 。

这仅在我添加Set时发生

@Entity
@Table(name = "TOPIC")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Topic implements Serializable {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;

    @OneToMany(
            fetch = FetchType.LAZY, 
            cascade = CascadeType.REMOVE,
            mappedBy = "topic"
        )
    private Set<Comment> comments= new HashSet<>();

    @OneToMany(
            fetch = FetchType.LAZY, 
            cascade = CascadeType.REMOVE,
            mappedBy = "topic"
        )
    private Set<Example> examples = new HashSet<>();

}

@Entity
@Table(name = "COMMENT")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Comment implements Serializable {
    
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;
        
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "Topic_ID")
    private Topic topic;

    @OneToMany(
            fetch = FetchType.LAZY, 
            cascade = CascadeType.REMOVE,
            mappedBy = "comment"
        )
    private Set<AnotherExample> anotherExamples = new HashSet<>();  
}

public interface TopicDto{
    Long getId();
    Set<CommentDto> getComments();
}

public interface CommentDto{
    Long getId();
}

public interface TopicRepository extends JpaRepository<Topic, Long> {   
    List<TopicDto> findAllBy(Sort sort);
}

@Service
@Transactional
public class TopicService {
   private final TopicRepository topicRepository ;

   public TopicService(TopicRepository topicRepository ) {
      this.topicRepository = topicRepository ;
   }

   @Transactional(readOnly = true)
   public List<TopicDto> getAllTopics(Sort sort) {
      List<TopicDto> l = topicRepository.findAllBy(sort);
      return l;
   } 
}

共有2个答案

卢作人
2023-03-14

–存储库管理的域类型–存储库所管理的实体的id类型

所以返回域对象是正常的。您指定了@Entity主题类。

我希望答案是有帮助的。

濮阳默
2023-03-14

首先,将您的TopicRepository更改为使用主题Topic,而不是

public interface TopicRepository extends JpaRepository<Topic, Long> {   
    List<Topic> findAllBy(Sort sort);
}

然后,您需要以下 DTO 类:

import java.util.HashSet;
import java.util.Set;

public class TopicDto {
    private Long id;
    private Set<CommentDto> comments= new HashSet<>();

    public TopicDto(Long id, Set<CommentDto> comments) {
        this.id = id;
        this.comments = comments;
    }
}
public class CommentDto {
    private Long id;

    public CommentDto(Long id) {
        this.id = id;
    }
}

最后,在您的TopicService中,您需要执行从TopicTopicDto的映射,如下所示:

@Service
@Transactional
public class TopicService {
   private final TopicRepository topicRepository ;

   public TopicService(TopicRepository topicRepository ) {
      this.topicRepository = topicRepository ;
   }

   @Transactional(readOnly = true)
   public List<TopicDto> getAllTopics(Sort sort) {
      List<Topic> topics = topicRepository.findAllBy(sort);
      return topics.stream()
                .map(topic -> {
                    Set<CommentDto> commentsDto = topic.getComments().stream()
                            .map(comment -> new CommentDto(comment.getId()))
                            .collect(Collectors.toSet());
                    return new TopicDto(topic.getId(), commentsDto);
                })
                .collect(Collectors.toList());
   } 
}
 类似资料:
  • 我写了自己的类加载器,它与类一起工作,实现了接口插件。但是我不能将类转换为插件。怎么了? 错误:(18,47)java:不兼容的类型:java。lang.类无法转换为插件 我补充说,这是我的SimpleClassLoader类的主要部分,它扩展了ClassLoader。

  • 我试图让2支球队互相比赛。当我说团队1.玩(团队2)时,我称之为;当 i 生成的数字小于 0.5 时,team2 应获胜,如果大于 0.5,则团队 1 应获胜。当团队 1 获胜时,它会正确显示为尼克斯,但当团队 2 获胜时,它会显示内存地址。我怎么能让它正确地说网是赢的,而不是team@78987neu73

  • 我正在使用RepositoryItemReader作为阅读器。我需要一起处理该块的整个读取器值列表。 当我试图通过扩展读取器返回列表来执行块处理时,在我的处理器中,我收到错误 类Car不能转换为java.util.list(Car位于加载程序“app”的未命名模块中);java.util.List位于加载程序“bootstrap”的java.base模块中 读者 贮藏室ˌ仓库 处理器 步骤

  • 我有这样的查询,我想从中提取电影标题及其评级 但此列表显然不能存储具有2个值的结果集 在了解它之后,我发现例如这个链接Spring Data: JPA repository findAll()返回*Map而不是List?但我似乎不清楚它们的实现。 我不明白他们从哪里得到第一个链接中的长值 我如何创建我的地图? 电影类: 评级等级:

  • 有几个很好的博客关于如何使用泛型类实现存储库模式和工作单元模式。 使用实体框架6.1实现数据访问层 实现存储库和工作单元模式 这个想法是,定义一个通用接口IRepository和一个隐藏数据实际访问方式的类存储库。可以使用实体框架DbContext来访问它,或者存储库可能是用于单元测试的内存集合。 我经常看到添加了几个与Queryable和/或Enumerable函数类似的Query函数。 例如,

  • 问题内容: 我正在为我的Web应用程序使用Hibernate和Spring。 在数据库操作中,Hibernate正在缓存实体并在下一个请求中返回它们,而不读取实际的数据库。我知道这将减少数据库的负载并提高性能。 但是,尽管此应用仍在构建中,但我需要在每个请求中从数据库加载数据(测试原因)。 有什么办法可以强制数据库读取? 我确定从此log4j消息进行缓存。 问题答案: 或(如果您使用JPA)将为您