Powiązanie tabel w spring boot

0

cześć wszystkim

mam encję product i category, produkt może być przypisany do wielu kategorii

Moje trzy tabele do tego wyglądają mniej więcej tak:

product:
id
name
...

category:
id
name
....

product_categories:
category_id
product_id
priority

W encji Product mam coś takiego:

	@ElementCollection(fetch = FetchType.EAGER)
	@CollectionTable(name = "product_categories", joinColumns = @JoinColumn(name = "product_id"))
	@Column(name = "category_id")
	private List<Integer> categories;

Dzięki temu moge tez sobie wyświetlić listę produktów z danej kategorii. Ale jak trzeba to powiązać aby domyślnie sortowało mi po polu priority z tabeli product_categories, czyli posortowane produkty z danej kategorii.

4

Oducz się patrzenia magicznego

Tabele, cała JPA nie ma NIC wspólnego ze Spring Boot (choć ma nieco wspólnego ze Spring bez "boot", który tworzy warstwę nad JPA)

Sortowanie przy pobieraniu z baz danych nigdy nie jest gwarantowane, o ile się tego nie zażąda. Owszem, warto się do tego przygotować - jeśli trzeba - przez przygotowanie indeksu.

0

OK dzięki za wykład ale nadal nie wiem jak to powiązać?

1
biurostron napisał(a):

OK dzięki za wykład ale nadal nie wiem jak to powiązać?

Nikt nie będzie zgadywał co masz w niepublikowanym kodzie. Moze za kasę bym stawiał domniemania, co tam jest, ale to jest portal dobrowolny

Skąd pomysł na List<Integer> a nie obiektowe przywołanie klasy ? To jest w jakimś tam sensie legalne, ale dla ciebie bez sensu

4

Weź wywal to JPA w cholerę. Użyj czegoś co jest bliżej SQLa i dopiero mając wynik, mapuj to na obiekty. Więcej będziesz się kopał z JPA niż z niego pożytku.

0

ja tylko potrzebuje wskazówki jak powiązać te trzy tabele sensownie o których pisałem w pierwszym poście. Nie mogę zrezygnować z JPA skoro juz większość projektu jest na tym oparta etc.

1
biurostron napisał(a):

ja tylko potrzebuje wskazówki jak powiązać te trzy tabele sensownie o których pisałem w pierwszym poście. Nie mogę zrezygnować z JPA skoro juz większość projektu jest na tym oparta etc.

Jeśli jest tak oparta, jak List<Integer> to naprawdę nie ma czego żałować
należy sądzić, ze masz jakiś mix kodu recznego, automatycznego zarządzania encjami i cholera wie czego jeszcze. Resztę kodu pewnie wstyd opublikować?

UPDATE: Pisałem tu wielokrotnie. JPA miodem nie jest, ale można używać jak się umie, i używa tak, aby mieć z tego jakieś zyski (obiektowo). Mix JPA i ręcznego SQL, czy w tym przypadku ręcznego (jak się domyślam) zarządzania encjami sumuje wady i nie daje możliwych zalet

0

Ale co mam publikować kod jak go nie mam póki co i nie mam pomysłu w jaki sposób powiązać te trzy tabele ze sobą

1

Jesli kumasz SQL, dawno byś miał mistrzowskie kwerendy ręczne z sortowaniem, jakie sobie wymarzysz - na obiekty byś zmapował JDBI, Spring JDBC Template, Batisem lub jeszcze innymi.

(ps. gdyby to był mój projekt, olałbym pieszczenie tak mało istotnego sortowania na deklaratywnym opisie bazy - bo JPA takim jest - sortowałbym na kliencie). Nawet nie pamiętam jak się deklaruje sortowanie w takim przypadku. Użyłem albo raz w życiu, albo wcale.
BTW: wiesz, jakie "wydajne" jest List<> w JPA ?

0

@OrderBy("product_categories.priority DESC") nie działa?

0

próbuje w ten sposób i bez product_categories ale nie sortuje sie

1
biurostron napisał(a):

próbuje w ten sposób i bez product_categories ale nie sortuje sie

Adnotacje sortujące nad List<> są pełne niuansów. To nie działa jak czarodziejska różdżka. Jak działa? Nie podejmuję się wytłumaczyć, unikam List<> jak mogę

PS. Ale nadal uważasz, ze chcesz mieć List<integer> ? To sobie chyba integery posortujesz

3
  1. Jak ktoś już wspomniał, Spring nie ma tu nic do rzeczy
  2. List<> i JPA to bardzo złe połączenie i sugerowałbym w ogóle do niego nie podchodzić
  3. JPA to kupa i zalecałbym się go pozbyć
  4. Powinieneś tam mieć List<Category> jeśli w ogóle, bo jak zrobiłeś na pałe List<Integer> to chyba bez gołego query w JPQL się nie obejdzie teraz

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