class Hund { private String navn; private int alder; private List<Humans> bestFriendList = new ArrayList(); }
Så har jeg et HundView objekt jeg bruger til at selecte ud i det ser således ud.
class Hund { private String navn; private List<Humans> bestFriendList = new ArrayList(); }
Nu vil jeg så lave en hql der skal selecte ovenstående ud.
Dvs. noget lig
select h.navn as navn, bestFriendList as bestFriendList from Hund left outer join a.bestFriendList as bestFriendList
Denne hql giver mig de hunde jeg søger men kun med en bestFriend og det er ikke en liste men blot det første objekt af Humans den finder der er joinet. Ved i om man overhovedet kan det jeg søger? Eller er jeg nød til at selecte bestFriends bagefter per Hund.
Det vil egentlig også være ok at det kun er den første bestFriend hvis jeg kan få et count af dem så jeg kan skrive hundens navn samt navnet på den første best friend og så bagefter antallet af venner =)
Ved godt det er lidt et tænkt eksempel. Men havde en opgave der krævede at jeg snuste lidt til hql og nu er interessen vakt for at se hvad der egentlig er muligt.
Selve modelleringen har jeg styr på altså hvordan jeg laver en hund med en liste af mennesker og får det persisteret. Jeg kan også lave en hql der bare trækker en liste af hunde ud hvor hver af dem indeholder en liste af mennesker. Det jeg ikke kan finde ud af er at lave en hql der trækker alle hunde ud hvor jeg ikke selecter objektet hund ud men kun nogle af værdierne og hvor en af værdierne så er en liste af mennesker.
Men hvis nu hund objektet er meget stort og indeholder meget data så var det for at lave performance optimering at jeg ville lave et udtræk som kun indeholder de data jeg skal bruge for at lette arbejdet for databasen. F.eks. til en master detail side hvor jeg skal præsentere en liste af hunde og når man så vælger en hund ville jeg læse alt data om hunden.
Grunden til jeg vil lave et view objekt til det og ikke bare selecte de ting jeg skal bruge og komme det i en Hund =) er for ikke at risikere at den halve hund bliver sendt retur til serveren og på den måde får ødelagt noget data.
Jeg ved ikke om det er best practice at gøre det på den måde men jeg syntes det virker som den mest logiske tilgang. Ellers skulle jeg sætte en masse parametre til lazyloadet på Hunden og det vil jeg gerne undgå da jeg ved udtræk af hunden gerne vil have dem eager loadet.
Min pointe er at Hibernate og HQL er beregnet til:
database--->Hibernate objekter
De er ikke beregnet til:
Hibernate objekter--->andre objekter
Det sidste kan du nemt lave udenom Hibernate.
Hvis du vil have nogle Hibernate klasser som er et subset af dine nuværende Hibernate klasser, så lav dem som standard Hibernate klasser.
Hvis du ikke skal bruge den store version, så drop den. Du kan sagtens have en klasse som "mangler" nogle kolonner i databasen.
Du kan også have en stor og en lille klasse som mapper til samme tabel(ler). MEN PAS PÅ CACHE !!!!
Hvis du af performance hensyn vil undlade at oade noget, så brug lazy loading. Det eksisterer for det samme. Og er formentligt betydeligt bedre performende end en transformering.
Hvis du er nysgerrig, så må jeg lave et eksempel og se hvordan man fisker det hele ud i en transformering.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.