无法>从类型[java.lang.Object []]转换为类型> [com.rh.app.batch.domain.A] java

时间:2018-02-24 11:54:28

标签: java spring jpa spring-boot

我试图从表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 []]转换为type   [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]

4 个答案:

答案 0 :(得分:1)

我不确定这是否是您要查找的内容,但是当您想要将复杂查询的结果映射到一个对象时,您可以使用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();

如果您正在寻找,请告诉我。

答案 1 :(得分:1)

就我而言,该问题通过添加默认构造函数得以解决。 例如:

public Person() {
}

答案 2 :(得分:0)

您的存储库接口方法返回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);

bRepository方法

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

答案 3 :(得分:0)

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

你有 JpaRepository

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

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