Maja Miarecki

Maja Miarecki Senior Frontend
Developer

Temat: order by rand() - jak w hql?

Pomozcie,

jak zrobic order by rand() w hql-u? Mam 700 tys rekordow w bazie, nie bede wyciagala wszystkich, zeby szuflowac liste i wyciagnac 100 losowych...

Dlaczego hql nie trzyma standardow?
Łukasz Żuchowski

Łukasz Żuchowski Software Wizard

Temat: order by rand() - jak w hql?

A kto powiedział że HQL jest zgodny z SQL ?
Maja Miarecki

Maja Miarecki Senior Frontend
Developer

Temat: order by rand() - jak w hql?

Nikt. Moje pytanie dotyczylo czegos innego :)

A ja wciaz nie wiem, jak wyciagnac 100 losowych rekordow z 700 tys.
Łukasz Żuchowski

Łukasz Żuchowski Software Wizard

Temat: order by rand() - jak w hql?

Prostego rozwiązania nie widze.

Ale ja najpier bym puścił counta na rekordach i zobaczył ile jest rekordów, a potem samemu ustalił na podstawie ich liczby odpowiedzniego where'a który "robił by" tą randomiazcje na podstawie liczby rekordów (np. wyciągał co n-tego).
Żeby ograniczyć liczbę wyciągniętych rekordów ustawiasz na query.setMaxResults(100).
To taki "work around" może ktoś znajdzie jakieś lepsze rozwiązanie, mi się nie udało.
Pozdrawiam.

Ps. teoretycznie wywołanie samego select'a bez "order by" nie gwarantuje żadnej powtarzalej kolejności (co nie znaczy że wywołanie 2 kolejnych selektów nie da tego samego wyniku).
Tak więc może select + ustawienie maxResults wystarczy. Podejrzewam jednak że taki select będzie zbyt mało randomowy.
Maja Miarecki

Maja Miarecki Senior Frontend
Developer

Temat: order by rand() - jak w hql?

Tak na prawde kolejnosc wyciaganych rekordow bez where'a zalezy od confa bazy. najczesciej domyslnym warunkiem jest data lub pk id

Nie moge za bardzo zajezdzac bazy, bo dziala na niej jeszcze kilka innych systemow. Ilosc rekordow znam, bo tabelka jest martwa (tzn nie dochodza do niej nowe dane). Problemem jest wylosowanie niewielkiej ilosci z calej puli.

Googluje w poszukiwaniu innego rozwiazania :)

Ale jakby ktos cos wiedzial - to ja jestem otwarta na wszelkie pomysly
Stefan Makarewicz

Stefan Makarewicz Project Manager,
Właściciel, Soft
Solution

Temat: order by rand() - jak w hql?

Nie wiem jak to wydajnościowo będzie ale mam taki pomysł.

1. Tworzymy temptabele z 1 kolumną "id", gdzie wrzucamy 100 losowych wartości.
2. Robimy "select a.* from naszatabela a join temptabela b on a.id=b.id"
3. mamy 100 losowych rekordów (o ile trafimy z identyfikatorami).

Można też pewnie bez tworzenia tabeli ale nie wiem na jakiej bazie pracujesz i co można wykorzystać.
Paweł Zięba

Paweł Zięba Android Developer

Temat: order by rand() - jak w hql?

Nie bardzo sie znam na HQL, ale moze moj pomysl sie przyda. Jesli dane w tabeli sie nie zmieniaja to moze warto wyciagnac kolumne z id, zapisac w pliku, a potem dobierac sie za pomoca RandomAccessFile do 100 przypadkowych wartosci id w pliku korzystając przy tym z metody seek(pozycja). Potem stworzyc zapytanie zawierające wybrane id, np. w ten sposob jak kolega napisal powyzej z tworzeniem temptable.
Stefan Makarewicz

Stefan Makarewicz Project Manager,
Właściciel, Soft
Solution

Temat: order by rand() - jak w hql?

Znalazłem coś takiego:

http://www.petefreitag.com/item/466.cfm

konto usunięte

Temat: order by rand() - jak w hql?

przecież można w hibernate używać zwykłego SQL nie koniecznie HQL
named query i jazda...

Następna dyskusja:

jak to napisać w j2ee




Wyślij zaproszenie do