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