Spring 引导存储库 - 直接从数据库加载 DTO

Spring Boot Repository - load DTO's direct from the Database

在我的应用程序中,我使用 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);
} 

最近看到另一种方案,没有service层的改造步骤

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

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

并且文本太 'heavy' 无法与洞书一起发送,您通常会像这样创建一个 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);
}

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

这些是 return 从数据库中获取数据的几种方法。

  1. 您创建 DTO 并映射必要的字段并且 return
  2. 另一种是直接从Repository创建一个return类型的接口。这就是我们所说的 JPA 接口投影。

第二个,你看下面就知道了link https://www.baeldung.com/spring-data-jpa-projections

当我们查询存储库中的两个或多个实体时,JPA 接口投影非常有用class

如果对象足够简单,这对于简单的 GET 来说完全没问题,尽管您当然不能添加额外的逻辑、格式或约束。但只要你不需要那样做,这就很好用。

我认为 Hibernate 不会仅将 dto 分析到 select 几个字段,所以如果你也想提高性能,你可以自己定义查询,即 @Query("select new com.bla.SlimbookDTO(book.id, book.title) from Book book"),在不能再根据方法名称使用自动生成的查询的成本。