【问题标题】:Converting Native Query Result To POJO : Error on boolean field将本机查询结果转换为 POJO:布尔字段错误
【发布时间】:2021-09-12 16:52:13
【问题描述】:

我有一个用例,我必须运行本机查询。我能够成功运行它,但是当我尝试将结果集转换为 dto 时,我在布尔字段上遇到错误。 由于我使用的是 MySQL,所以布尔值列在数据库中为 bit(1)。

这是包装器的代码

public interface DownloadDetails {
   Boolean getBooleanField();  //Doesnot work but why?
   Integer getBooleanFieldAsInt(); //Works but needs explicit check to boolean in code 
   Long getLongField();
}

本机查询:

@Query(nativeQuery = true, value = CUSTOM_QUERY)
List<DownloadDetails> getDownloadDetails();

现在,当我尝试执行 downloadDetails.getBooleanField() 之类的操作时,它不起作用并出现错误

投影类型必须是接口!

我在这里遗漏了什么?

【问题讨论】:

    标签: spring-boot hibernate spring-data-jpa


    【解决方案1】:

    不知道为什么你需要一个本机查询,但也许你可以使用Blaze-Persistence Entity Views

    我创建了该库以允许在 JPA 模型和自定义接口或抽象类定义模型之间轻松映射,例如 Spring Data Projections on steroids。这个想法是您按照自己喜欢的方式定义目标结构(域模型),并通过 JPQL 表达式将属性(getter)映射到实体模型。

    使用 Blaze-Persistence Entity-Views 的用例的 DTO 模型可能如下所示:

    @EntityView(DownloadEntity.class)
    public interface DownloadDetails {
        @IdMapping
        Long getId();
        @Mapping("CAST_BOOLEAN(booleanStringAttribute)")
        String getBoolean();
        Long getLongField();
    }
    

    查询是将实体视图应用于查询的问题,最简单的就是通过 id 进行查询。

    DownloadDetails a = entityViewManager.find(entityManager, DownloadDetails.class, id);

    Spring Data 集成让您可以像使用 Spring Data Projections 一样使用它:https://persistence.blazebit.com/documentation/entity-view/manual/en_US/index.html#spring-data-features

    Page<DownloadDetails> findAll(Pageable pageable);
    

    最好的部分是,它只会获取实际需要的状态!

    【讨论】:

      【解决方案2】:

      作为一种解决方法,我做了这样的事情

      public interface DownloadDetails {
         String getBooleanFieldAsString();
         Long getLongField();
      
         default Boolean getBooleanFieldAsBoolean(){
            return BooleanUtils.toBoolean(getBooleanFieldAsString());
         } 
      

      }

      这是我能想到的最好和最简洁的解决方法。此外,如果您想使用此接口直接发回响应(您可能会考虑避免),请使用 @JsonIgnore@JsonProperty("customName")

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-10
        • 2014-11-17
        • 1970-01-01
        • 1970-01-01
        • 2019-08-31
        • 1970-01-01
        • 1970-01-01
        • 2010-10-31
        相关资源
        最近更新 更多