簡體   English   中英

無法從類型 [java.lang.Object[]] 轉換為類型

[英]Failed to convert from type [java.lang.Object[]] to type

我有 Spring Web 應用程序(JPA/Hibernate + MySQL)。 我有兩個 DAO 類。

客戶DAO

@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<>();
}

訂單DAO

@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<>();

我有一個從數據庫檢索數據的類:

@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        |
......

現在我想用這個方法從數據庫“拆箱”數據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[]] 轉換為類型 [com.twistezo.models.Customer] 的值“{Bieecki, 141.49}”; 嵌套異常是 org.springframework.core.convert.ConverterNotFoundException:找不到能夠從類型 [java.lang.String] 轉換為類型 [com.twistezo.models.Customer] 的轉換器

我想這是因為我得到List<Object[]> 我知道我可以在我的數據的List<Object[]>之間進行迭代,但也許有一些更簡單的方法可以將數據直接檢索到<Customer> 我是這方面的新手。 從現在開始,我使用了像List<Customer> findAll()沒有 @Query 注釋的方法,我正在尋找類似的“拆箱”。

我試圖做這樣的事情(在查詢中添加 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();

我建議創建一個 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();

因此,您無需手動解析結果集。

我已經收到此錯誤消息。 就我而言,我正在做類似下面的代碼:

@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”參數化的其他類型。

在您的情況下,您正在使用“訂單”參數化 JpaRepository,然后使用返回“客戶”列表的方法......也許這會導致此異常。

我也遇到過類似的情況,但就我而言,不需要映射(訂單到客戶)。

如果您在同一個域 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);

您的查詢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   | 

這就是結果集被映射到客戶實體的方式。 如果您想堅持查詢,請將返回類型更改為List<Object[]> ,然后遍歷列表並提取所需的數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM