hibernate + join

0

hej, czy ktos z Was moglby mi wytlumaczyc jak zrobic join w hibernate? czytam przyklady na google ale ich po prostu nie rozumiem.
Przyklad-mamy 2 tabele: osoba i miasto:

OSOBA:
osoba_id| imie| miasto_id

MIASTO:
miasto_id|miasto

i teraz jak chce wyciagnac z bazy osoby (imie i miasto) ktorych imie to 'Jan' to w sqlu:

   select osoba.imie, miasto.miasto from osoba  join miasto on miasto.miasto_id=osoba.miasto_id where
               osoba.imie='Jan';

jak to przerobic na hibernate?
probowalam:

select osoba.imie, miasto.miasto from Osoba osoba join Miasto miasto on miasto.miastoId=osoba.miastoId where
               osoba.imie='Jan'

ale nie dziala. a przyklady ktore znalazlam w necie sa dla mnie niezrozumiale. bo np:

      String sql_query = "select 
d.name,p.name,sum(p.price) as
 totalprice from Product 
p join p.dealer d group by p.name";

co znaczy: p join p.dealer d? gdzie tu w ogole mam polaczenie z tabela d? bo p-to Product. moglby mi ktos wytlumaczyc jak sie tutaj robi joina?

pzdr,
misty

0

Ale gdzie tu widzisz Hibernate?

0

no to hsql. ucze sie hibernate no i chce wyciagnac te dane o ktorych napisalam wyzej.

0
        Session session = sessionFactory.openSession();
        String query = "";
        
        List list = session.createQuery(query).list();
        session.close();

chodzi mi o to-jak napisac query w hsql zeby dostac taki wynik jak opisalam na poczatku?

pzdr

0

List<Osoba> list = session.createQuery("from Osoba o where o.imie='Jan'").list();
powinno zadziałać. Wydaje mi się, że złączenie nie jest potrzebne kiedy jest to relacja wiele-do-jednego (Osoba - Miasto). Gdybyś chciał wybrać listę miast i dla każdego dołączyć osoby z danego miasta, to w przypadku ustawienia w relacji właściwości "fetch="lazy"" musiałbyś dokonać złączenia w zapytaniu, np. "from Mistao m inner join m.osoby os".

0

no wlasnie o tym pisze-jak zrobic zlaczenie? w rzeczywistosci moje zapytanie laczy 4 tabele, chcialam tylko przyklad jak zlaczyc 2. czyli jak zapytanie w sql:

   select osoba.imie, miasto.miasto from osoba  join miasto on miasto.miasto_id=osoba.miasto_id where
               osoba.imie='Jan';

przerobic na hsql?? bo na prawde nie rozumiem

0

ps. jestem ona

0
Query query = em.createQuery("SELECT o FROM Osoby o LEFT JOIN FETCH o.miasto WHERE o.imie = :imie");
query.setParameter("imie", imie);
List<Osoba> osoby = query.getResultList();

Jeżeli relacja jest wiele do wielu, to zamiast "SELECT" trzeba dać "SELECT DISTINCT", aby nie duplikowały się osoby mieszkające w kilku miastach.

0

query.getResultList();

skad wziales te metode getResultList()? bo ani jej u siebie nie widze ani w hibernate api.

pzdr

0

Kod, który podałem powinien działać na wszystkich providerach JPA (Hibernate, OpenJPA, Toplink), gdyż używa czystego JPA-QL.

http://java.sun.com/javaee/5/docs/api/javax/persistence/Query.html

Czy używasz JPA (entityManager.createQuery zwracające javax.persistence.Query), czy też bezpośredniego API Hibernate (session.createQuery zwracające org.hibernate.Query)?

Polecam pierwsze rozwiązanie, ale jeżeli wolisz 2. to przeczytaj http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html#queryhql-joins .

0

lub też tak:

Criteria c = session.createCriteria("osoba").createCriteria("miasto_id");
c.add(Restrictions.eq("imie", "Jan"));
List l = c.list();

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