Avatar billede obix Nybegynder
10. maj 2010 - 20:44 Der er 3 kommentarer

Mere hibernate hql

Hej Eksperter.

Hvis jeg har et objekt.

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.
Avatar billede arne_v Ekspert
11. maj 2010 - 03:48 #1
Jeg forstår slet ikke pointen.

Du kan nemt lave en HQL som laver en liste med alle DB hundene, hvor hver af dem har en liste af mennesker.

Hvis så du vil have en liste af view hunde, så synes jeg da at det var nemmest at tage den første liste og konvertere den !?!?
Avatar billede obix Nybegynder
11. maj 2010 - 06:39 #2
Hej Arne.

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.

Mvh. Obix
Avatar billede arne_v Ekspert
12. maj 2010 - 03:41 #3
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.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester