2013-10-08 60 views
0

I'm在Hibernate中新我想這樣的回報HQL查詢:在hibernate上返回成員對象而不是Object [] row =(Object [])ite.next();

select u.user, up.name from Usuario u 
    join u.usuarioPersonals as up 
    where u.idusuario=1 

後,我恢復這個resulset在我的道,並顯示在控制檯上

List d = usuarioDao.test(1); 

    Iterator ite = d.iterator(); 

    while (ite.hasNext()) { 
      Object[] row = (Object[]) ite.next(); 
      System.out.print("\t\t"+row[0]); 
      System.out.print("\t"+row[1]); 
      System.out.println(); 
    } 

我的問題是有沒有其他選項來獲取數據對象,如Usuario.getUser()UsuarioPersonals.getName()?

另一種選擇是隻寫我HQL一句話是這樣的:

from Usuario u 
    join u.usuarioPersonals as up 
    where u.idusuario=1 

而且在我的數據迭代

while (ite.hasNext()) { 
     Object[] row = (Object[]) ite.next(); 
    Usuario usr = (Usuario) row[0]; 
     UsuarioPersonals usr = (UsuarioPersonals) row[1]; 
     System.out.print(usr.getUser()); 
     System.out.print(usr.getName()); 
    } 

最後一個選項或許是複雜的,如果我想通過我的servlet發送到我的看法。

對不起,我是新技術,我期待其他選擇,但可能只存在這兩個選項發送數據。

謝謝!

+0

Usuario和UsuarioPersonals有什麼關係?在兩個實體之間建立關係,您可以遍歷對象並找到想要的值 – SAP

+0

謝謝,我的關係運行良好,因爲如果我打印Dao對象,是否顯示結果。也許最好的選擇,如果和使用servlets和jsp是POJO接口上的映射,用DAO結果Object填充POJO接口對象併發送給查看,我不知道是不是一個好習慣 – vljc2004

回答

1

您通常不需要指定連接。

from Usuario u 
where u.idusuario=1 

這將返回Usuario對象的列表,您可以遍歷對象圖來獲取任何東西。

如果你看看正在生成的SQL,你會看到UsuarioPersonals不在那裏。發生什麼事情是當你嘗試訪問它時,Hibernate會產生SQL。在一個小應用程序中,你不會有任何問題,但是如果你想優化,並且你知道你總是訪問這些對象,你可以構造類似於你現在正在做的查詢:

from Usuario u 
    join fetch u.usuarioPersonals as up 
    where u.idusuario=1 

這會將UsuarioPersonals數據放置在對象上,因此它不需要額外的數據庫調用。再次,可能沒有必要,你通常可以選擇根對象。

+0

謝謝大衛!如果我想優化我的應用程序,我可以使用根對象,你可以建議不要發送行對象到我的視圖做一個類,我可以映射我的界面(如struts)和填充此對象與我的根對象?使用此選項,我可以通過我的對象屬性訪問,例如usr.getName(),usr.getUser()。 – vljc2004

+0

是的,如果您只選擇持久性實體,則可以在視圖中使用這些實體。如果在呈現視圖之前關閉會話,則無法加載任何內容,因此需要通過執行聯合提取來加載。一個好的方法是在你的hibernate配置文件中打開show_sql,這樣你就可以看到所有生成的SQL,並知道優化是否正常。 –

相關問題