【问题标题】:Spring Boot Repository - load DTO's direct from the DatabaseSpring Boot Repository - 直接从数据库加载 DTO
【发布时间】:2020-07-08 17:57:36
【问题描述】:

在我的应用程序中,我使用 DTO。我目前的伪代码解决方案是这样的 - 效果很好:

ResponseEntity<EntityDTO> RestController.get(String uuid){
    EntityDTO dto = Service.get(uuid) {
         Entity entity = Repository.loadEntity(id);
         return EntityDTO.from(entity);
    }
    return ResponseEntity<EntityDTO>( dto , HttpStatus.OK);
} 

最近看到了另一种解决方案,没有在服务层进行转换步骤。

例如你的实体看起来像这样 :

@Entity
public class Book {
     Long id;
     String title;
     String text;
     .....
}

而且文本太“重”,无法与通常会像这样创建 DTO 的漏洞书一起发送:

public class SlimBookDTO {,
     static SlimBookDTO from(Book book) {
           return new SlimBookDTO(book.id, book.title);
     }
     Long id;
     String title;
     .....
}

“新”(对我来说)解决方案是只创建一个这样的界面:

public interface SlimBookDTO {
    Long getId();
    String getTitle();
}

您的 BookRepository 获得了一个新方法:

@Repository
public interface BookRepository extends JpaRepository<Book , Long> {

    List<SlimBookDTO> findAllByTitle(String title);
}

使用这种方法,我不再需要服务层来处理直接请求。这很常见吗?有人有这方面的经验吗?它有一些我在小型应用程序中看不到但在更大范围内会面临的缺点吗?

【问题讨论】:

    标签: java spring spring-boot dto


    【解决方案1】:

    这些是从数据库返回数据的几种方式。

    1. 您创建 DTO 并映射必要的字段并返回
    2. 其他是创建一个接口,该接口直接是一种来自存储库的返回类型。这就是我们所说的 JPA 接口投影。

    对于第二个,您可以参考以下链接详细了解 https://www.baeldung.com/spring-data-jpa-projections

    当我们在 Repository 类中查询两个或多个实体时,JPA 接口投影非常有用

    【讨论】:

    • 很好的链接! 5. 动态投影是我如何在没有两种方法的情况下在 DTO 和真实对象之间进行选择的问题的答案。
    【解决方案2】:

    如果对象足够简单,这对于简单的 GET 完全没问题,当然您不能添加额外的逻辑、格式或约束。但只要您不需要这样做,这将很好地工作。

    我不认为 Hibernate 分析 dto 只选择几个字段,所以如果你也想提高性能,你可以自己定义查询,即@Query("select new com.bla.SlimbookDTO(book.id, book.title) from Book book"),代价是不能只不再使用基于方法名称自动生成的查询。

    【讨论】:

    • 在我的情况下,这将是负担得起的高成本。我的应用程序很小,但如果它增长它是有用的。谢谢
    猜你喜欢
    • 1970-01-01
    • 2016-01-28
    • 2017-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-10
    • 1970-01-01
    • 2016-10-28
    相关资源
    最近更新 更多