Jak wczytać niestandardowe recordy?

Jak wczytać niestandardowe recordy?
B1
  • Rejestracja:ponad 2 lata
  • Ostatnio:10 miesięcy
  • Postów:24
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.

edytowany 5x, ostatnio: Riddle
KamilAdam
  • Rejestracja:ponad 6 lat
  • Ostatnio:4 dni
  • Lokalizacja:Silesia/Marki
  • Postów:5505
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


Mama called me disappointment, Papa called me fat
Każdego eksperta można zastąpić backendowcem który ma się douczyć po godzinach. Tak zostałem ekspertem AI, Neo4j i Nest.js . Przez mianowanie
edytowany 1x, ostatnio: KamilAdam
B1
  • Rejestracja:ponad 2 lata
  • Ostatnio:10 miesięcy
  • Postów:24
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:ponad 6 lat
  • Ostatnio:4 dni
  • Lokalizacja:Silesia/Marki
  • Postów:5505
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


Mama called me disappointment, Papa called me fat
Każdego eksperta można zastąpić backendowcem który ma się douczyć po godzinach. Tak zostałem ekspertem AI, Neo4j i Nest.js . Przez mianowanie
B1
  • Rejestracja:ponad 2 lata
  • Ostatnio:10 miesięcy
  • Postów:24
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:ponad 6 lat
  • Ostatnio:4 dni
  • Lokalizacja:Silesia/Marki
  • Postów:5505
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


Mama called me disappointment, Papa called me fat
Każdego eksperta można zastąpić backendowcem który ma się douczyć po godzinach. Tak zostałem ekspertem AI, Neo4j i Nest.js . Przez mianowanie
AK
  • Rejestracja:ponad 6 lat
  • Ostatnio:około rok
  • 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)


Bo C to najlepszy język, każdy uczeń ci to powie
edytowany 2x, ostatnio: AnyKtokolwiek
B1
  • Rejestracja:ponad 2 lata
  • Ostatnio:10 miesięcy
  • Postów:24
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?

RequiredNickname
przykładu Ci nie podam ale zasugeruję, że znajdziesz w google wynik jak obchodzić się z czasem w mniej niż półtorej minuty a wiedząc już, że Date jest przestarzałe będziesz nawet umiał odsiać stare tutoriale od świeższych wpisów.
KamilAdam
  • Rejestracja:ponad 6 lat
  • Ostatnio:4 dni
  • Lokalizacja:Silesia/Marki
  • Postów:5505
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


Mama called me disappointment, Papa called me fat
Każdego eksperta można zastąpić backendowcem który ma się douczyć po godzinach. Tak zostałem ekspertem AI, Neo4j i Nest.js . Przez mianowanie
jarekr000000
Tu działa takie prawo - niezależne trochę od języka: z prawdopodobieństwiem dochodzącym do 120% początkujący w danej technologii skorzysta z totalnie przestarzałego tutoriala
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)