【问题标题】:Use native query with Spring Projection Interface to select fields使用带有 Spring Projection Interface 的本机查询来选择字段
【发布时间】:2020-01-28 02:38:45
【问题描述】:

我想知道如何填充这些类:

interface BaseDTO {

    Integer getId();

    String getNome();

    Boolean getAtivo();

    RegionalDTO getRegional();

    MunicipioDTO getMunicipio();
}

interface RegionalDTO {

    Integer getId();
}

interface MunicipioDTO {

    Integer getId();
}

然后运行这个查询

@Query(value = "SELECT " +
        "base.ID_BASE AS id, base.NOME AS nome, base.ATIVO AS ativo, " +
        "regional.ID_REGIONAL AS ID_REGIONAL, " +
        "municipio.ID_MUNICIPIO AS ID_MUNICIPIO " +
        "FROM TB_BASE base " +
        "LEFT JOIN TB_REGIONAL regional on base.ID_REGIONAL = regional.ID_REGIONAL " +
        "LEFT JOIN TB_MUNICIPIO municipio on base.ID_MUNICIPIO = municipio.ID_MUNICIPIO " +
        "ORDER BY base.ID_BASE", nativeQuery = true)
List<BaseDTO> getAll();

所以我想选择查询中的字段,因为后面我会在这些DTO中放更多的字段。

【问题讨论】:

    标签: java spring spring-boot spring-data


    【解决方案1】:

    我认为最简单的方法是使用只有regionalmunicipio 的ID 的简单接口。调用getAll 后将此接口映射到适当的类结构(其中 id 变成 dto)。

    List<RealDTO> result = repository.getAll().stream()
      .map(i -> new RealDTO(i))
      .collect(Collectors.toList());
    

    【讨论】:

      【解决方案2】:

      首先,我需要将我的 DTOS 转换为类

      @Value
      public class BaseDTO {
      
          private Integer id;
          private String nome;
          private MunicipioDTO municipio;
          private RegionalDTO regional;
      
          public BaseDTO(Integer id, String nome, Integer municipioId, Integer regionalId) {
              this.id = id;
              this.nome = nome;
              this.municipio = new MunicipioDTO(municipioId);
              this.regional = new RegionalDTO(regionalId);
          }
      }
      
      
      @Value
      public class MunicipioDTO {    
          private Integer id;    
      }
      
      @Value
      public class RegionalDTO {    
          private Integer id;    
      }
      

      所以在我的存储库中我做到了

      @Query(value = "SELECT new com.apivgosmobile.dto.model.BaseDTO(base.id, base.nome, municipio.id, regional.id)" +
              "FROM Base base " +
              "LEFT JOIN base.municipio municipio " +
              "LEFT JOIN base.regional regional " +
              "WHERE base.ativo = 1 " +
              "ORDER BY base.id ASC")
      List<BaseDTO> getAll();
      

      【讨论】:

        猜你喜欢
        • 2018-09-05
        • 1970-01-01
        • 2017-03-04
        • 1970-01-01
        • 1970-01-01
        • 2018-06-02
        • 1970-01-01
        • 2019-04-15
        • 1970-01-01
        相关资源
        最近更新 更多