Jak wczytać niestandardowe recordy?

0

Hej,

Natrafiłem na pewien błąd i chciałbym się poradzić.

Korzystam ze Spring'a i Hibernate'a, baza MySql. Chciałbym z bazy danych pobrać dane już trochę opracowane, a nie czyste rekordy. Wymyśliłem sobie w repozytorium taką SQLke:

 @Modifying(clearAutomatically = true)
@Query(value = "SELECT customer_id, company_id as company, sum(total_quantity), sum(total_price), avg(stock_index_value) FROM orders WHERE customer_id=:customerId GROUP BY company_id", nativeQuery = true)
List<Orders> findOrderDataByCustomer(@Param("customerId") int customerId);

no i dostaję błąd:

2023-06-14 10:24:36.319  WARN 6084 --- [nio-8080-exec-3] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 0, SQLState: S0022
2023-06-14 10:24:36.319 ERROR 6084 --- [nio-8080-exec-3] o.h.engine.jdbc.spi.SqlExceptionHelper   : Column 'id' not found.
2023-06-14 10:24:36.326 ERROR 6084 --- [nio-8080-exec-3] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessResourceUsageException: could not execute query; SQL [SELECT customer_id, company_id as company, sum(total_quantity), sum(total_price), avg(stock_index_value) FROM orders WHERE customer_id=? GROUP BY company_id]; nested exception is org.hibernate.exception.SQLGrammarException: could not execute query] with root cause

Moje pytanie brzmi następująco. Czy dobrze rozumiem, że błąd jest spowodowany tym, że nie pobieram z bazy "id", a jest to wymagane w przypadku JpaRepository?
Jeśli nie to co robię źle? Ostatecznie chyba pobiorę z tabeli wszystkie rekordy i opracuje sobie w serwisie, tak jak potrzebuję, ale chciałbym zrozumieć co zrobiłem źle.

Edit:
Hmm, zacząłem dodawać po kolei kolejne kolumny z tabeli i zaczęło działać dopiero gdy dodałem pobieranie wszystkich, które mam w encji.

3
Batman109 napisał(a):

Hej,

Natrafiłem na pewien błąd i chciałbym się poradzić.

Korzystam ze Spring'a i Hibernate'a, baza MySql.

Ja tu już widzę trzy błędy :P ale bądzmy poważni :D

 @Modifying(clearAutomatically = true)
    @Query(value = "SELECT customer_id, company_id as company, sum(total_quantity), sum(total_price), avg(stock_index_value) FROM orders WHERE customer_id=:customerId GROUP BY company_id", nativeQuery = true)
    List<Orders> findOrderDataByCustomer(@Param("customerId") int customerId);

Pokaż Order bo podejrzewam że to co zwaracasz z findOrderDataByCustomer to wcale nie jest Order. Jeśli to nie jest faktycznie Order to powinieneś napisać jakiegoś DTO do zwrócenia tych danych

0
package Example.StockApp.model;


import lombok.Getter;
import lombok.Setter;
import org.hibernate.annotations.CreationTimestamp;

import javax.persistence.*;
import java.util.Date;

@Entity
@Table(name = "orders")
@Getter
@Setter
public class Orders {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="id")
    private int id;

    @ManyToOne
    @JoinColumn(name = "customer_id")
    private Customer customerId;

    @ManyToOne
    @JoinColumn(name = "company_id")
    private CompanyIndex companyId;

    @Column(name = "total_quantity")
    private int totalQuantity;

    @Column(name = "transaction_type")
    private String transactionType;

    @Column(name = "stock_index_value")
    private String stockIndexValue;

    @Column(name = "total_price")
    private String totalPrice;

    @Column(name = "date_created")
    @CreationTimestamp
    private Date dateCreated;

}

No tak, prawda, DTO też bedzie potrzebny, ale tu był problem już na etapie pobrania z bazy.
Nie wiem czy to mądre czy głupie pytanie, ale czy w takim razie muszę mieć pobrane zawsze wszystkie pola z encji, bo inaczej będzie rzucać kolejne błędy?
Jakie są jeszcze pozostałe 2 błędy? :-)

0
Batman109 napisał(a):

No tak, prawda, DTO też bedzie potrzebny, ale tu był problem już na etapie pobrania z bazy.

Ale ty nie pobierasz z bazy Orderu, ty pobierasz z bazy coś co ma pola customer_id, company_id as company, sum(total_quantity), sum(total_price), avg(stock_index_value). Dlatego wywala sie w hibernate na mapowaniu tego na Ordera

0
KamilAdam napisał(a):
Batman109 napisał(a):

No tak, prawda, DTO też bedzie potrzebny, ale tu był problem już na etapie pobrania z bazy.

Ale ty nie pobierasz z bazy Orderu, ty pobierasz z bazy coś co ma pola customer_id, company_id as company, sum(total_quantity), sum(total_price), avg(stock_index_value). Dlatego wywala sie w hibernate na mapowaniu tego na Ordera

Ok, to rozumiem.
Ale to w takim razie jest jakieś mądrzejsze wyjście niż pobranie wszystkich orderów, przemapowanie na encje powyzsza i za pomocą javy wyliczenie tych wartości rekordów sum,avg itd?
Jest w ogóle możliwość, żeby bezpośredniu z użyciem springa i hibernate zastosować takie wyciągnięcie z bazy jak tamta powyższa sqlka?

1
Batman109 napisał(a):

Jest w ogóle możliwość, żeby bezpośredniu z użyciem springa i hibernate zastosować takie wyciągnięcie z bazy jak tamta powyższa sqlka?

Tak, użyj DTO https://stackoverflow.com/questions/23719237/mapping-jpa-or-hibernate-projection-query-to-dto-data-transfer-object

1
KamilAdam napisał(a):

Ja tu już widzę trzy błędy :P ale bądzmy poważni :D

Nie mniej niż 4

Batman109 napisał(a):

import java.util.Date;

To z jakiegoś tutka starszego od ciebie ?

Przechodząc do rdzenia.
Użycie Hibernate / JPA , krytykowane lub nie do obsługi (dwustronnej: gospodarka zmianami w obiektach) pełnych encji ma / może mieć sens.

Do zagadnień myślowo utrzymanych w SQL (Chciałbym z bazy danych pobrać dane już trochę opracowane) - daje wszystkie koszty i kłopoty JPA ale ta inwestycja nie zwraca żadnych zysków.
Jakieś niezależne mappery, JDBI, JOOQ, i jeszcze z pięć innych.
JPA mialo duży sens w innej epoce, z długo żyjącymi obiektami / encjami - w webówce "per request" znacznie, znacznie mniejszy.

@Table(name = "orders") public class Orders {

Do tej liczby mnogiej nie ma podstaw, nazwa klasy jest zła (choć tabeli dobra)

0
Batman109 napisał(a):

import java.util.Date;

To z jakiegoś tutka starszego od ciebie ?

Ale co z tym jest nie tak? Serio pytam.
Jesli juz się tego nie stosuje, to mógłbyś dać jakiś przykład czego najsensowniej używać do daty?

0
Batman109 napisał(a):
Batman109 napisał(a):

import java.util.Date;

To z jakiegoś tutka starszego od ciebie ?

Ale co z tym jest nie tak? Serio pytam.
Jesli juz się tego nie stosuje, to mógłbyś dać jakiś przykład czego najsensowniej używać do daty?

Zobacz sobie cały pakiet https://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html
Ogólnie java.util.Date poszło na śmietnik historii

1 użytkowników online, w tym zalogowanych: 0, gości: 1