Fehler beim konvertieren vom Typ [java.lang.Object[]] zu geben
Ich spring web app (JPA/Hibernate + MySQL).
Ich habe zwei DAO-Klassen.
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<>();
Und ich habe eine Klasse zum abrufen von Daten aus 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();
}
Es ist mir z.B. Folgendes Ergebnis:
+---------+---------------+
| surname | sum of amount |
+---------+---------------+
|Bielecki | 141.49 |
|Bielen | 130.34 |
......
Nun will ich 'unbox' Daten aus DB mit dieser Methode List<Customer> findCustomersBySumOfAmount()
Ich habe die Methode für das in meiner spring-controller-Klasse:
List<Customer> findCustomersBySumOfAmount = orderService.findCustomersBySumOfAmount();
model.addAttribute("findCustomersBySumOfAmount", findCustomersBySumOfAmount);
for(Customer c : findCustomersBySumOfAmount) {
String s = c.getSurname();
System.out.println(c);
}
Und ich habe Fehler:
Failed to convert from type [java.lang.Object[]] zu geben
[com.twistezo.Modelle.Kunde] für Wert " {Bielecki, 141.49}'; geschachtelte
Ausnahme ist
org.springframework.core.konvertieren.ConverterNotFoundException: Nein
Konverter gefunden, die in der Lage Konvertierung von type [java.lang.String] zu
type [com.twistezo.Modelle.Kunde]
Ich nehme an, es ist weil ich bin immer List<Object[]>
. Ich weiß, dass ich die Iteration zwischen dieser List<Object[]>
meiner Daten, aber vielleicht gibt es eine einfachere Möglichkeit zum abrufen von Daten direkt an <Customer>
? Ich bin neu in diesem Zeug. Da ich jetzt verwendeten Methoden wie List<Customer> findAll()
ohne @Query annotation und ich bin auf der Suche nach ähnlichen "unboxing".
Ich versuchte etwas wie das hier tun (hinzufügen Customer.class in Abfrage) ohne Wirkung:
@Query("select o.customer.surname, sum(o.amount) as s from Order as o group by o.customer", Customer.class)
List<Customer> findCustomersBySumOfAmount();
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich würde vorschlagen, erstellen eines POJO-Klasse nur zum speichern der Ergebnisse der Abfrage:
Dann ändern Sie Ihre Abfrage, um die folgenden:
Dank, dass Sie brauchen nicht zu analysieren, das Ergebnis manuell eingestellt.
Validation failed for query for method public abstract java.util.List com.twistezo.repositories.OrderDAO.findCustomersBySumOfAmount()!
und Intellij schlägtCannot resolve constructor 'com.twistezo.repositories.CustomerTotalAmountResult(java.lang.String, java.math.BigDecimal)
in Teil ( o.Kunden.Nachname , sum(o.Betrag))`, Wie man dieses Problem beheben ? ich habe noch nie gesehen Abfrage Konstruktion wie dieser, aber sieht aus wie, dass die Anpassung (fit) an den Konstruktor (String, BigDecimal).could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet
, können Sie helfen auf diese?Ihre Abfrage
select o.customer.surname, sum(o.amount) as s from Order as o group by o.customer
nicht zurückCustomer
. Der Kunde Unternehmen erwartet, das Ergebnis mindestens so Aussehen:Dass Sie wie die Ergebnismenge abgebildet in die Kunden-Entität. Wenn Sie möchten, halten Sie Ihre Abfrage, dann ändern Sie den Rückgabetyp zu
List<Object[]>
, und laufen Sie durch die Liste, und extrahieren Sie die Daten, die Sie möchten.List<Object[]> findCustomersBySumOfAmount();
mitfor(Object[] o : findCustomersBySumOfAmount){ System.out.println(o[0]); System.out.println(o[1]); }
ich habeBielecki 141.49 Bielen 222.39 Nowak 40.80 Nowakowski 171.78
aber wie Verbinde ich diese Parameter, zum Beispiel mitCustomerAmountResult
Klasse aus @Maciej Kowalski post ?