PDA

Επιστροφή στο Forum : Hibernate Query



dvm
23-01-08, 13:05
Γεια χαρά σ'όλους, έχω ένα δύσκολο σήμερα.
Έστω ότι στη βάση έχουμε 3 πίνακες, Authority, Account, User
Μια authority μπορεί να έχει πολλούς account που συνδέονται μέσω του User.
Έστω δηλαδή:


Authority:
id: integer
name: varchar
phone: varchar
reg_date: timestamp

Account:
id: integer
firstname: varchar
lastname: varchar
username: varchar
password: varchar

User:
fk_authority: integer
fk_account: integer


Θέλω να κάνω ένα query που θα μου επιστρέψει το authority name, το authority reg_date (registration_date) και το account lastname. Ιδεατά αυτά θα μου τα επέστρεφε σε ένα πχ SearchResult bean με τα 3 properties.

To query σε SQL το έχω κάνει, το πρόβλημά μου είναι στο hibernate πως θα το κάνω. Καμιά ιδέα κανείς;

moshstef
23-01-08, 15:39
Πιστεύω πως σε αυτή την περίπτωση όπου δεν επιστρέφεις entities καλύτερα να βάλεις απλή JDBC.

Αλλά αν πρέπει να είναι hibernate τότε κάτι σαν αυτό ίσως (σε γενικές γραμμές):

String hql= "select a.name, a.reg_date, ac.lastname from Authority a, Account ac "; // φαντάζομαι θα θέλεις και κάποια parameters στο query

Query query = sess.createQuery(hql);
// οπότε εδώ θα σετάρεις τα parameters
List list = query.list();

Μετά κάνεις iterate στο list το οποίο θα περιέχει Object[] για κάθε row. Οπότε παίρνεις μία μία τις τιμές από το object[] , φτιάχνεις ένα new SearchResult για κάθε row και του σετάρεις τα πεδία. Αν θέλεις τα βάζεις σε ένα List<SearchResult>.

nikospara
23-01-08, 15:43
Γειά σου dvm!

Νομίζω το παρακάτω θα βοηθήσει:

Στη Hibernate query θα μπούν τα ονόματα των πεδίων όπως ορίζονται στα αντικέιμενά σου και όχι όπως είναι στη βάση. Αν λοιπόν στο αντικείμενο User ορίζονται οι:



public Authority getAuthority();
public Account getAccount();


Δοκίμασε:



SELECT u.authority.name,u.authority.regDate,u.acount.lastName
FROM User u
WHERE ...???...


Το Hibernate θα φροντίσει για τα joins και θα σου επιστρέψει Object[], με τα αποτελέσματα.

EDIT: ...όπως λέει και ο moshstef

dvm
23-01-08, 18:54
Σας ευχαριστώ ρε παιδιά :) Με την βοήθειά σας το κατάλαβα και τα κατάφερα. Απλά δυσκολευόμουν να αλλάξω την σκέψη μου από sql σε hql. Κατάλαβα περίπου και τι παίζει με τ'αντικείμενα τώρα στην hql.

dvm
24-01-08, 12:13
Οκ, παιδιά κάτι ακόμα. Σήμερα, μετά από μερικές μικρολεπτομέρειες διάβασα και τα αποτελέσματα.
Γίνεται με κάποιο τρόπο να πω στο Hibernate να βάλει τα αποτελέσματα σε ένα bean που έχω κάνει;
Απλά θα ήθελα αν γίνεται να αποφύγω να κάνω με το χέρι


new SearchResult((String)result[0], (String)result[1], (String)result[2]);

που δεν είναι και πολύ object oriented, αλλά να γέμιζε το hibernate το SearchResult αυτόματα.

nikospara
24-01-08, 13:21
Δοκίμασε στην HQL σου:



SELECT new SearchResult(u.authority.name,u.authority.regDate,u.acount.lastName)
FROM User u
WHERE ...???...


(ίσως το SearchResult να πρέπει να είναι fully qualified)

dvm
24-01-08, 14:49
:worthy: :respekt:

Α, ναι ήθελε το fully qualified name.

@ ADSLgr.com All rights reserved.