Hibernate, konstrukcja zapytania HQL

0

Witam:)

z hibernate mam do czynienia dopiero od kilku dni i natknąłem się na pewien problem.
Chciałbym z bazy wyciągnąć dane, które opierają się o 2 tabele. Zapytanie SQL`owe w bazie działa wyśmienicie, jednakże nie potrafię go za Chiny przerobić na zapytanie HQL.

Treść zapytania:

SELECT  name, street, city, description, (SELECT AVG( rate ) FROM user_restaurant_rating WHERE user_restaurant_rating.restaurant_id = restaurants.id) as rate FROM restaurants ORDER BY rate DESC LIMIT 0,3

po pierwsze, nie mogę znaleźć, jak wyciąga się konkretne wartości z tabelki za pomocą HQL (większość przykładów w Internecie zaczyna się od "from). Po drugie, nie bardzo wiem, jak zagnieździć tego drugiego selecta w zapytaniu.
Jakieś sugestie? Na pewno ktoś z Was będzie bardziej obeznany w temacie niż ja:)

pozdrawiam

0

Próbowałeś coś w stylu:

SELECT  r.name, r.street, r.city, r.description, (SELECT AVG( urg.rate ) FROM user_restaurant_rating urg WHERE urg.restaurant_id = r.id) AS rate FROM restaurants r ORDER BY rate

?

wydaje mi się, że użycie LIMIT może nie przejść. Chyba lepiej jak to wrzucisz do NamedQuery i użyjesz setMaxResults().

I jeśli masz błędy to przydałoby się je wkleić ; )

//edit:
a w ogóle to może lepiej jakoś tak:

SELECT r.name, r.street, r.city, r.description,
AVG( urg.rate ) AS rate
FROM restaurants r,user_restaurant_rating urg
WHERE urg.restaurant_id = r.id
ORDER BY rate

0

Ok, mam małe problemy z mapowaniem teraz:) spróbuję z tym Twoim drugim zapytaniem. Tak btw, set.MaxResults() działa tylko na NamedQuery, na zwykłym nie zadziała?

0

Wszystko co zaczyna się od from zwraca encję, czyli pobiera wszystkie kolumny i zwraca całay obiekt. Jak chcesz bawić się selekatmi to hibernate domyślnie zwróci listę tablic Object[liczba kolumn z selecta] i dostęp indeksowany, chyba najgorsze co można zrobić (z punktu widzenia czytelności i utrzymywalności kodu). Poczytaj o projekcjach i resultTransformerach. Wygodniejsze byłoby już tworzenie hashmap, lub select new MyObject(a tu podajesz nazwy kolumn) i wtedy dostajesz listę MyObject (ważny jest konstruktor takiej klasy).

Przykładowo mój przykład:
select so.id, (select count(id) from OrderItem oI where oI.order = so.id) from ShopOrder so

pamiętaj że w hqlu nie ma nazw tabel (user_restaurant_rating) tylko nazwy mapowany obiektów (UserRestaurantRating) i akcesory po kropie

0
czesiu89 napisał(a)

Ok, mam małe problemy z mapowaniem teraz:) spróbuję z tym Twoim drugim zapytaniem. Tak btw, set.MaxResults() działa tylko na NamedQuery, na zwykłym nie zadziała?

nie mam api w głowie, ale wydaje mi się, że jak zrobisz em.createQuery to zwrócony z tego obiekt ma metodę setMaxResults - sprawdź ; )

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