@ElementCollection + postgres = zmiana kolejności?

0

Hej, mam taki case z adnotacją @ElementCollection i postgresem. Używam JPA /Hibernate.

Relacja w encji wygląda tak:

@CollectionTable(name = "item_image", joinColumns = @JoinColumn(name = "item_id"))
@Column(name = "image_id")
@ElementCollection(fetch = LAZY)
private List<ImageId> pictures;

Przy zapisie zwraca mi encje z tymi rysunkami w dobrej kolejności.
Ale jak pytam o nie potem w metodzie find to są w odwrotnej :O

Testy na h2 przechodzą, ale postgres zwraca odwrotnie.

Jakieś pomysły ?

1

A kombinowałeś może z adnotacją @OrderBy?

1

Co to znaczy w odwrotnej kolejności?
Rzuć okiem na @OrderColumn jeśli oczekujesz pewnego porządku (nie piszę w Javie, ale Google'ować umiem).

0

@Pinek:
To, że OrderBy ogarnę to wiem, ale zastanawiam się jak to działa pod spodem, że h2 zwraca dobrze, a postres odwrotnie.

@Saalin
Załóżmy, że dostaję z GET te pictures w kolejności img1, img2, im3. Robię puta, gdzie wysyłam w tej samej kolejności: img1, img2, im3.
GET zwraca je iimg3, img2, img1.

1

Dlaczego w ogóle oczekujesz, że SELECT na bazie bez ORDER BY zwraca wiersze w **jakiejkolwiek **kolejności?

3
  1. Niekoniecznie wiem - bo wiedza z hibernate mi zanika.

Może masz przypadkowo dobrą kolejność. Na h2 - w prostych przypadkach masz przypadkiem dobrze, ale nic Ci tego (bez OrderColumn nie gwarantuje).

0

@Saalin:
Wiem, że to naiwne, ale staram się dojść do tego czy odwrócenie kolejności to sprawa bazy danych dokładnie czy czego. Bo h2 zwraca zawsze dobrze (albo po prostu w większości przypadków).

0

Wiesz, że implementacja List w JPA jest mocno ciężka i pokrętna?

Ja użyłbym Set'a i sortował w kodzie (może nieortodoksyjny pomysł)

private Set<ImageId> pictures;
...

ImageId[] sortedPistures () 
{
}

Nie udowodnię, ale mniemam, że oszczędności na obsłudze Set "zapłacą" za sortowanie

1

Jak chcesz zagwarantować kolejność to musisz wskazać JPA, o jaka kolejność chodzi. Albo dodajesz dodatkowa kolumnę z indeksem (chyba @OrderColumn) albo wskazujesz po jakiej kolumnie sortować (chyba @OrderBy)

1
AnyKtokolwiek napisał(a):

Wiesz, że implementacja List w JPA jest mocno ciężka i pokrętna?

Ja użyłbym Set'a i sortował w kodzie (może nieortodoksyjny pomysł)

It depends. Set też jest pokręcony. W szczególności z powodu equals i hashCode (i tego, że JPA też z owych korzysta) - czasem nie da się tego zrobić do końca dobrze, albo wydajnie.
(w zależności od wymagań).

0

Ok, a ma ktoś teraz sprawdzony sposób jak zmigrować stare dane po dodaniu kolumny ? :D Jak daję default 0 to oczywiście wszystkie kolekcje zwracają 1 element - z wiadomego powodu. Jakiś sequencer może ?

0

Spróbuję procedurą.

EDIT:

Ok, procedura zadziałała na pgsql, ale h2 nie ogarnia :D ... a że nasz CTO chce flywaya dla testów integracyjnych na h2 to w sumie trochę jestem w dupie XD

@jarekr000000 te windows functions to chyba na h2 też nie przechodzą :O

0

A sprawdzałeś @OrderBy? bo @OrderColumn ma zupełnie inną logikę za sobą.

1

Nie prościej posortować po select'cie z JPA? Możesz skorzystać z:
Sort.by("cośtam).descending/ascepting();
Tak jak tutaj:
https://www.baeldung.com/spring-data-jpa-pagination-sorting
albo własne query jak tutaj przy czystym Hibernate:
https://www.baeldung.com/hibernate-sort
Albo jeszcze inaczej i po prostu posortować w kodzie Javovym (najmniej optymalne :D )

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