Jak wczytać niestandardowe recordy?

Jak wczytać niestandardowe recordy?
B1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 25
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:

Kopiuj
 @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:

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

KamilAdam
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Silesia/Marki
  • Postów: 5550
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

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

B1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 25
0
Kopiuj
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? :-)

KamilAdam
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Silesia/Marki
  • Postów: 5550
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

B1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 25
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?

KamilAdam
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Silesia/Marki
  • Postów: 5550
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

AK
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3561
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)

B1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 25
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?

KamilAdam
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Silesia/Marki
  • Postów: 5550
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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.