Mohlo by jít místo addJoin dát addEntity a pak přidat setResultTansformer, který by to dostal do správného tvaru.
Jinak HQL i Criteria umí dělat EAGER fetch přes join. I když si nejsem jistý, jestli to zvládnou v každé situaci. 2012/11/19 Arnošt Hrdina <hrdina.arn...@elvoris.cz> > Díky ale nebude to asi to pravé. > > Nejsem si jistý, ale pokud používám HQL, tak se z hlavního selektu naplní > pouze entita, která je ve frázi FROM a na definicích EAGER se > generují parciální sql příkazy k naplnění referencovaných entit. To není > žádoucí. Pomalé pro větší seznam. > > Navíc se říká, aby byl sql příkaz optimální, má načítat jen to, co > potřebuji. > > Podařilo se mi vydedukovat v dokumentaci, jak má být popsaný seznam v > selektu. > Takže Select {s.*}, {pd.*}, {t.element.*} from entita en > > join PersDate pd on pd.entita_id=en.id > left join entita_tariffs ents on ....... > join Tariff t on ....." > > generuje příkaz správně bez spojovací tabulky entita_tariffs, bohužel > načtení výsledku metodou query.list() havaruje. > > SQLQuery query = session.createSQLQuery(cmd) > .addEntity("en", EntitaImpl.class) > > .addJoin("pd","en.persData") > .addJoin("t","en.**insuredTariffs"); > List<Entita> query.list(); > > metoda .addJoin("t","en.**insuredTariffs") nejspíš musí být pro tento > případ jinak. Nedaří se mi zjistit, jak to v tomto případě má být. > > Má s createSQLQuery někdo zkušenosti? > > Děkuji. > > Arnošt > > > Dne 16.11.2012 15:22, Petr Janata napsal(a): > > Nevím, jestli to v tomhle konkrétní případě pomůže, ale fetchStrategy >> se dá změnit i v jednotlivé query v HQL nebo Criteria API. Možná se >> vyhnete psaní native SQL. >> >> HQL: left join fetch x.collection >> CriteriaAPI criteria.setFetchMode("**collection", FetchMode.JOIN) >> >> Petr >> >> On 16/11/2012, Arnošt >> Hrdina<hrdina.arnost@elvoris.**cz<hrdina.arn...@elvoris.cz>> >> wrote: >> >>> Vážení, >>> >>> používám Hibernate a v některých případech jsem se nevyhnul použití >>> nativní sql. >>> Aby mi v závislostech LAZY negeneroval hibernate jednotlivé sql příkazy, >>> což při širším seznamu výsledku představuje neúnosný čas, >>> napsal jsem nativní sql příkaz, který by měl vše načíst naráz i do >>> závislých entit i pro entity, které jsou definovány jako LAZY. >>> >>> Mám ale problém v případě, relace ManyToMany, kdy je závislost >>> definována: >>> >>> @Entity("entity") >>> class Entita ... { >>> >>> @ManyToOne(fetch = FetchType.LAZY, cascade = { CascadeType.PERSIST, >>> CascadeType.MERGE }, >>> targetEntity = .... .PersonalDataImpl.class) >>> @JoinColumn(name = "`persData`") >>> private PersonalData persData; >>> >>> @ManyToMany( fetch = FetchType.LAZY, targetEntity = ..... >>> TariffImpl.class) >>> @JoinTable(name = "entita_tariffs", >>> joinColumns = {@JoinColumn(name = "entita_id") }, >>> inverseJoinColumns = @JoinColumn(name = "tariff_id")) >>> private List<Tariff> tariffs; >>> >>> ...... >>> >>> } >>> >>> Dále použiji nativní select >>> >>> String cmd = >>> "Select {s.*}, {pd.*}, {t.*} from entita en >>> join PersDate pd on pd.entita_id=en.id >>> left join entita_tariffs ents on ....... >>> join Tariff t on ....." >>> >>> >>> A načítám >>> >>> Session session = (Session) getEntityManager().** >>> getDelegate(); >>> >>> SQLQuery query = session.createSQLQuery(cmd) >>> .addEntity("en", InsuredSubjectImpl.class) >>> .addJoin("pd","en.persData") >>> .addJoin("t","en.**insuredTariffs"); >>> >>> EnttyManager je injektován Springem, ale to nejspíš nemá vliv. >>> Problém je, že se mi Hibernate tom případě z {t.*} vygeneruje na >>> t.entita_tariffs_entita_id, t.entita_tariffs_tariffs_id, t.id, t. ... >>> další pole z tabulky Tariff. >>> Jenže t.entita_tariffs... jsou pole z tabulka entita_tariff, která >>> tabulky spojuje tabulky Entita a Tariff a pochopitelně v tabulce Tariff >>> neexistuje a havaruje. >>> Pokud je jednoduchá závislost, jako .addJoin("pd","en.persData"), tak >>> vše funguje správně. >>> Nepřišel jsem na způsob, jak to zapsat a příklad mi Dr.Google též >>> neposkytl. >>> Neřešil jste prosím pánové tento problém někdo? >>> >>> Děkuji předem za radu a pomoc. >>> >>> Arnošt >>> >>> >>> >>> >> > -- Ondra Medek