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

Odpovedet emailem