【问题标题】:JPA Repository Native query return custom class instead of ObjectJPA Repository Native 查询返回自定义类而不是 Object
【发布时间】:2022-11-20 02:29:03
【问题描述】:

在我的存储库类中,我正在使用 @Query 注释执行本机查询,只需从 MyDomain 中选择几个字段,如下所示:

@Repository
public interface MyRepository extends JpaRepository<MyDomain, Long> {
    @Query("SELECT q.firstname, q.lastname from MyDomain q WHERE q.firstname = :firstname")
    Page<MyDomain> findByFirstName(String firstname, Pageable pageable);
}

这是从 MyDomain 转换为 Dto 的映射器,反之亦然

@Mapper(componentModel = "spring")
public interface Mapper {

    MyDomainDto toDto(MyDomain data);
    MyDomain fromDto(MyDomainDto data);
}

然后我在服务中调用这个方法:

    private ResponseEntity<List<MyDomainDto>> getByFirstName(String firstname, Pageable pageable) {
        Page<MyDomain> page = dataRepository.findByfirstName(firstname, pageable);
        List<MyDomain> result = page.getContent();

        return new ResponseEntity<>(
                result.stream().map(mapper::toDto).collect(Collectors.toList()), HttpStatus.OK);
    

当我获取结果 Page&lt;MyDomain&gt; page = dataRepository.findByfirstName(firstname, pageable); 时,它返回一个对象列表而不是我的自定义类 MyDomain

但是,如果我像这样使用本机查询,通过从 MyDomain 获取所有数据


@Repository
public interface MyRepository extends JpaRepository<MyDomain, Long> {
    @Query("SELECT q from MyDomain q WHERE q.firstname = :firstname")
    Page<MyDomain> findByFirstName(String firstname, Pageable pageable);
}

然后我会得到 Page&lt;MyDomain&gt; page = dataRepository.findByfirstName(firstname, pageable);返回的自定义类MyDomain

当我只取几个字段而不是所有字段时,如何获得相同的结果? 我尝试将其投射到 My Domain 但没有成功。 提前致谢(如果有人在星期六阅读这篇文章)

【问题讨论】:

    标签: spring-boot jpa nativequery


    【解决方案1】:

    您可以通过将数据直接提取到 DTO 来实现它。

    如果您的 DTO 类如下所示:

    package com.your.project;
    
    public class MyDomainDto {
        private String firstname;
        private String lastname;
        
        public MyDomainDto(String firstname, String lastname) {
            this.firstname = firstname;
            this.lastname = lastname;
        }
    }
    

    然后您可以在您的存储库中按如下方式执行此操作:

    @Repository
    public interface MyRepository extends JpaRepository<MyDomain, Long> {
        @Query("SELECT new com.your.project.MyDomainDto(q.firstname, q.lastname) from MyDomain q WHERE q.firstname = :firstname")
        Page<MyDomainDto> findByFirstName(String firstname, Pageable pageable);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-15
      • 1970-01-01
      • 2019-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-23
      相关资源
      最近更新 更多