Overeenkomend is HQL
select header.advmagencymaster.mamaid,
header.advmagencymaster.mamaname,header.trohiono
from ADVRoheader header
Maar in HQL is het beter om het hele object op te halen, zodat we de andere eigenschappen ook kunnen gebruiken
from ADVRoheader header
inner join
header.advmagencymaster master
HQL is niet afhankelijk van de onderliggende database. Het is hetzelfde voor alle databases (Oracle, Mysql, SQL-server enz.). Alleen moeten we de databaseverbinding in het hoofdconfiguratiebestand wijzigen.
Je modelklassen zien er zo uit
class ADVMAgencyMaster{
private String mamaid;
private String mamaname; //getters and setters
}
class ADVRoheader{
private String trohiono;
private ADVMAgencyMaster advmagencymaster; // Reference to the ADVMAgencyMaster
//getters and setters}
U heeft al een veel-op-een relatie gedefinieerd in xml
<many-to-one name="advmagencymaster" class="com.adv.hibernatebean.ADVMAgencyMaster" fetch="select"> <column name="TROHAMAID" /></many-to-one>
Dus tijdens het laden van de ADVRoheader-objectslaapstand wordt ook de interne objectreferentie "advmagencymaster" geladen.
hiervoor moet je lazy="false" specificeren in plaats van fetch="select".
lazy="true" - lui laden zal alleen het bovenliggende object laden
lazy-"false" - gretig laden zal het onderliggende (innerlijke) object ook met het bovenliggende object laden.
voeg beide hbm.xml-bestanden als volgt toe aan het hoofdconfiguratiebestand (hibernate.cfg.xml)
<mapping resource="com/ADVRoheader.hbm.xml"></mapping>
<mapping resource="com/ADVRomaster.hbm.xml"></mapping>
net voor de sluitingstag van de sessiefabriek vindt hier de mapping plaats met Database.
Gewoonlijk moeten we voor generatorelementen het type integer gebruiken en de wijziging in de database ook doorvoeren.
Extra filtering kunnen we een 'where'-clausule toevoegen na de hoofdquery. Hier is alleen de voorwaarde voor samenvoegen vereist en deze wordt al afgehandeld door de slaapstand.