无法从类型[java.lang.Object []]转换为类型

时间:2017-02-24 19:11:28

标签: java mysql spring hibernate jpa

我有春季网络应用程序(JPA / Hibernate + MySQL)。 我有两个DAO课程。

CustomerDAO

@Entity
@Table(name = "customers")
public class Customer {

  @Id
  @Column(name = "customer_id")
  @GeneratedValue(strategy = GenerationType.AUTO)
  private Long id;

  @Column(name = "name", length = 50)
  private String name;

  @Column(name = "surname", length = 50)
  private String surname;

  @OneToMany(mappedBy = "customer")
  private Set<Order> orders = new HashSet<>();
}

OrderDAO

@Entity
@Table(name = "orders")
public class Order {

  @Id
  @Column(name = "order_id")
  @GeneratedValue(strategy = GenerationType.AUTO)
  private Long id;

  @Column(name = "date")
  private Date date;

  @Digits(integer = 5, fraction = 2)
  @Column(name = "amount")
  private BigDecimal amount;

  @ManyToOne(fetch = FetchType.LAZY)
  @JoinColumn(name = "customer_id")
  private Customer customer;

  @OneToMany(mappedBy = "order")
  private Set<OrderDetail> ordersDetails = new HashSet<>();

我有一个从DB中检索数据的类:

@Repository
public interface OrderDAO extends JpaRepository<Order, Long> {

    @Query("select o.customer.surname, sum(o.amount) as s from Order as o group by o.customer")
    List<Customer> findCustomersBySumOfAmount();

}

它给我这样的结果:

+---------+---------------+
| surname | sum of amount | 
+---------+---------------+
|Bielecki | 141.49        | 
|Bielen   | 130.34        |
......

现在我想要&#39; unbox&#39;来自DB的数据使用此方法List<Customer> findCustomersBySumOfAmount()

我的弹簧控制器类中有这个方法:

 List<Customer> findCustomersBySumOfAmount = orderService.findCustomersBySumOfAmount();
 model.addAttribute("findCustomersBySumOfAmount", findCustomersBySumOfAmount);

 for(Customer c : findCustomersBySumOfAmount) {
     String s = c.getSurname();
     System.out.println(c);
 }

我有错误:

  

无法从类型[java.lang.Object []]转换为type   [com.twistezo.models.Customer] for value&#39; {Bielecki,141.49}&#39;嵌套   例外是   org.springframework.core.convert.ConverterNotFoundException:没有   转换器发现能够从类型[java.lang.String]转换为   输入[com.twistezo.models.Customer]

我想是的,因为我得到List<Object[]>。我知道我可以在这List<Object[]>个数据之间进行迭代,但也许有一些更简单的方法可以直接将数据检索到<Customer>?我是这个东西的新手。从现在开始,我使用List<Customer> findAll()之类的方法而不使用@Query注释,并且我正在寻找类似的&#34;拆箱&#34;。

我尝试做这样的事情(在查询中添加Customer.class)没有效果:

@Query("select o.customer.surname, sum(o.amount) as s from Order as o group by o.customer", Customer.class) List<Customer> findCustomersBySumOfAmount();

4 个答案:

答案 0 :(得分:2)

我建议创建一个POJO类来存储该查询的结果:

package com.mypackage;

public class CustomerAmountResult{

    private String surname;
    private BigDecimal amountSum;

    public CustomerAmountResult(String surname, BigDecimal amountSum){
       this.surname = surname;
       this.amountSum = amountSum;
    }

    // getters / setters
}

然后将您的查询更改为以下内容:

@Query("select NEW com.mypackage.CustomerAmountResult(
            o.customer.surname, sum(o.amount)) 
        from Order as o
        group by o.customer.surname") 
List<CustomerAmountResult> findCustomersBySumOfAmount();

由于您不需要手动解析结果集。

答案 1 :(得分:1)

我也遇到过类似的情况,但就我而言,不需要映射(订单到客户)。

如果您在同一个域 POJO(这里是 CustomerDAO)中拥有所有字段,则无需创建新的 POJO 或将返回类型更改为 Object。您所需要的只是域 POJO 中的一个参数化构造函数(与您在 JPQL 查询中获取的字段相同)。

一个例子

package com.mypackage.domain

@Entity
@Table(name = "TABLENAME")
public class UserDO {

@Column(name = "FIRST_NAME")
private String firstName;

@Column(name = "LAST_NAME")
private String lastName;

@Column(name = "DOB")
private String dob;

public UserDO(){
}

public UserDO(String firstName, String lastName){
this.firstName = firstName;
this.lastName = lastName;
}


}

你的仓库应该包含这样的方法

@Query("Select NEW com.mypackage.domain.UserDO(user.firstName, user.lastName) from UserDO as user where user.lastName =?1")
UserDO findByLastName(String lastName);

答案 2 :(得分:0)

您的查询select o.customer.surname, sum(o.amount) as s from Order as o group by o.customer未返回Customer。 Customer实体期望结果集至少如下所示:

|   id   | name   | surname |
-----------------------------
|   1    | john   | smith   |
|   2    | james  | white   |
|   3    | sara   | black   | 

这就是结果集映射到Customer实体的方式。如果您想坚持查询,请将返回类型更改为List<Object[]>,然后浏览列表并提取所需的数据。

答案 3 :(得分:0)

我已经收到此错误消息。就我而言,我正在做类似以下代码的事情:

@Repository
public interface RepositoryA extends CrudRepository<EntityA, Long> {

  @Query(nativeQuery = true, value = " ...SQL_1... ")
  List<EntityA> getListOfEntityA(...PARAMS_1...);

  @Query(nativeQuery = true, value = " ...SQL_2... ")
  List<EntityB> getListOfEntityB(...PARAMS_2...);

}

我正在使用“ EntityA”参数化存储库接口,并使用另一种方法返回参数化为“ EntityB”的其他类型。

在您的情况下,您要使用“ Order”参数化JpaRepository,然后使用一种返回“ Customer”列表的方法...也许这是导致此异常的原因。