[英]org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.Object[]] to type
[英]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.