我有春季网络应用程序(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();
答案 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”列表的方法...也许这是导致此异常的原因。