【问题标题】:Failed to > convert from type [java.lang.Object[]] to type > [com.rh.app.batch.domain.A] java无法 > 从类型 [java.lang.Object[]] 转换为类型 > [com.rh.app.batch.domain.A] java
【发布时间】:2018-08-04 09:03:38
【问题描述】:

我试图从表 B 中获取数据并将其保存到类对象 A 中

 A sale = repository.getSale(m, stmtDate);

存储库

public interface repository extends JpaRepository<B, String> {
@Query(value = " SELECT ID AS id FROM B...LEFT JOIN C ... ", nativeQuery = true)
    A getSale(@Param("m") String m, @Param("date") String stmtDate);
}

A 类

@Entity
public class A implements Serializable {

 private String id; 
 public String getID() {
        return id;
    }

    public void setID(String id) {
        this.id = id;
    }
  }
    .....

错误

org.springframework.core.convert.ConversionFailedException: 失败 从类型 [java.lang.Object[]] 转换为类型 [com.rh.app.batch.domain.A] 价值 '{0e89c64c-d840-45c5-9c6a-bda52fbaa7d1, 201802, 5.000, 1, 0, 0}'; 嵌套异常是 org.springframework.core.convert.ConverterNotFoundException:否 发现转换器能够从类型 [java.lang.String] 转换为 输入 [com.rh.app.batch.domain.A]

【问题讨论】:

    标签: java spring jpa spring-boot


    【解决方案1】:

    您的存储库接口方法返回A.class 类型对象,而您的查询返回String (id)

    尝试将查询更改为 SELECT * FROM..

    或者改变方法签名,比如 String getMerchantSaleTxn(...

    编辑

    要存储另一个表中的数据,您必须执行以下操作

    B b = bRepository.findByMyId(myId);
    A a = b.getA();  //some method that converts B to A
    aRepository.save(a);
    

    b存储库方法

    @Query("select * from b where myId=:myId")
    B findByMyId(myId);
    

    【讨论】:

    • 但是存储库会从其他表返回其他数据。所有数据都将存储到类对象A中。
    • 但这将使用不同的方法对..您的方法签名与您的查询结果不匹配
    • A 类是实体还是简单的 POJO/DTO?
    • 您的存储库方法返回类型仍然与您的查询返回类型不匹配。还编辑了答案,演示了如何将记录从一个表保存到另一个
    • @EiriniGraonidou 是 @Entity
    【解决方案2】:

    我不确定这是否是您要查找的内容,但是,当您想将复杂查询的结果映射到一个对象时,您可以使用 SqlResultSetMapping 注释:

    假设你有一个类。

    public class PersonDTO {
    
    private String name;
    private Date birthDate;
    //omit other attributes 
    
    public Person(String name, Date birthDate) {
      this.name = name;
      this.birthDate = birthDate;
    
    }
    

    你装饰它如下。

    @SqlResultSetMapping(name="PersonDTOMapping",
                         classes="@ConstructorResult(
                         targetClass= PersonDTO.class,
                         columns = {@ColumnResult(name="name"),
                                    @ColumnResult(name="birhDate")}))
    

    你的查询变成:

    PersonDTO person = (PersonDTO) em.createNativeQuery("select p.name, p.birthDate as date from person where p.id=1", "PersonDTOMapping").getSingleResult();
    

    如果这是您要找的,请告诉我。

    【讨论】:

      【解决方案3】:

      在我的例子中,通过添加默认构造函数解决了这个问题。 例如:

      public Person() {
      }
      

      【讨论】:

        【解决方案4】:

        存储库将仅映射同一存储库上的对象。如果类不匹配,则会出现该错误。

        你有 JpaRepository

        这是一个对象类型 B 的存储库

        但是您正在转换为类型 Object A。在 A 的存储库中执行此操作,它将起作用(假设您有正确的列)。

        【讨论】:

          猜你喜欢
          • 2017-07-15
          • 2020-04-23
          • 2020-03-29
          • 1970-01-01
          • 2014-05-19
          • 1970-01-01
          • 2016-10-17
          • 1970-01-01
          • 2022-10-17
          相关资源
          最近更新 更多