① (java)如何將從資料庫中查詢出來的結果集轉換為對應類的對象可考慮hibernate。
List<BranchBase> rtnList = new ArrayList<BranchBase>();
String sql = "select * from params.tb_branch_kbmp where depttype <> 3070";
//從容器中得到session
Connection connection = null;
PreparedStatement statement=connection.prepareStatement(sql);
ResultSet resultSet= statement.executeQuery();
while(resultSet.next()){
//這里得一個一個取
BranchBase b=new BranchBase();
b.屬性名=resultSet.getInt("表的列名");//如果列為varchar()類型就resultSet.getString("表的列名")
//就這樣取完
rtnList.add(b);
}
return rtnList;
② Hibernate 和SQL轉換問題
參考,輸出的項目建個BEAN;
String sql = "select * from SYS_MENUS " +
"where id in (select mid from SYS_GRUP_MENU " +
" where GID in(select gid from SYS_GRUP_USER where " +
"usid=" + String.valueOf(userid) + " ))";
getSession().createSQLQuery(sql).addEntity(SysMenu.class).list();
③ hibernate 用sql和hql的區別
sql 面向資料庫表查詢
hql 面向對象查詢
hql : from 後面跟的 類名+類對象 where 後 用 對象的屬性做條件
sql: from 後面跟的是表名 where 後 用表中欄位做條件
查詢
在Hibernate中使用查詢時,一般使用Hql查詢語句。
HQL(Hibernate Query Language),即Hibernate的查詢語言跟SQL非常相像。不過HQL與SQL的最根本的區別,就是它是面向對象的。
④ [極品難]關於hibernate如何把原生sql查出的結果轉化為對象
例如我們有一個照片的POJava code//照片poclass Photo{int id;string title;
double avgScore;//平均分,這個欄位在資料庫中是沒有映射的,也就是 非持久化屬性}//投票po ,每張照片對應多個vote記錄class Vote{int id;int photoId;int score;}用sql = "select {p.*,avg(v.score) as p.avgScore} from photo p left join vote v on p.id = v.photoId ";
單純的sql結果很滿意,包含照片的信息和每張照片的平均分數。
代碼如下:Query query = session.createSQLQuery(sql.toString()).addEntity(Photo.class);
運行後,沒有錯誤,但是在SQL語句中的avg(v.score) as p.avgScore} 這一部分,沒有被像我們預期的那樣set進photo的avgScore屬性中。
問題:我們如果遇到要用原生sql進行查詢,並要將結果set進一個po中,其中set進po中的屬性,不完全是被可持久化的,例如本例
中的avgScore屬性。
PS: 請別和我說完全可以用hql等方式,這只是個簡單的示例,目前是想研究原生sql對象映射問題。
我仔細看了那篇文章,addScalar這個的意思似乎只是把查出來的非屬性結果進行類型綁定,我現在的困惑是如果把這個值自動綁定進po中~~
就像上面的例子,select出一個po,然後這個po中要有那個avgScore的屬性值,目前我試過即使用addScalar明確avgScore的類型,還是不會自動set進po中。。
列印出的SQL:
sql: select {p.id,p.user_id,p.url,p.state,avg(v.score) as p.avgScore} from photos p where p.user_id = :userId and p.state in ( 0, 1 ) group by p.id order by p.id desc
報了個這個錯:
44187 [http-8080-1] WARN org.hibernate.util.JDBCExceptionReporter - SQL Error: 1064, SQLState: 42000
44187 [http-8080-1] ERROR org.hibernate.util.JDBCExceptionReporter - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'from photos p where p.user_id = 13 and p.state in ( 0, 1 ) group by p.id orde' at line 1
2009-9-3 12:04:39 org.apache.catalina.core.StandardWrapperValve invoke
嚴重: Servlet.service() for servlet default threw exception
com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'from photos p where p.user_id = 13 and p.state in ( 0, 1 ) group by p.id orde' at line 1
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:936)
如果不加{}那麼就報在資料庫找不到p.avgScore這列,因為p.avgScore是一個虛似的臨時變數,非持久化屬性。
我提問題時只是簡單寫的示例,省略了幾個欄位,
sql = "select p.id,avg(v.score) from photo p , vote v where p.id = v.photoId group by p.id";
這么寫是可以,但不會被自動綁定進PO,我來問就是想知道在不調用SET方法的情況下能否自動把非欄位屬性綁定進PO。
您看看有沒有自動的方式綁定進PO的。。
因為我返回avg(v.score) as p.avgScore,其實在p這個po中是有setAvgScore()這個方法的,可是終始不會被調用 。。。
我甚至做過這個測試,把avgScore()設成@Cloumn(insertable=false,updateable=false),還是不會自動set進po中。。
⑤ hibernate sql查詢結果集怎麼轉換
在多表查詢的時候使用hibernate的sql查詢的時候,一般返回的是object[]數組,或者可以使用
session.createSQLQuery(sql).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
來轉化為map來進行處理,可以通過以下方式將查詢結果轉化為實體類:
1,sql語句 String sql="select s.id as id,s.classname as classname from grade s,student st where s.id=st.classid"
利用以下語句
session.createSQLQuery(sql) .setResultTransformer(Transformers.aliasToBean(Grade.class))可以將sql中查詢出來的欄位轉化為班級這個實體類,但是必須為每個欄位指定別名,別名就是班級類裡面的對應的屬性,但必須注意,對每一個列都必須addScalar("列名"),如果不設置addScalar方法可能會報轉型錯誤的異常.如果查詢的結果裡麵包括多個表裡面的欄位,不能對應一個實體類去接受,就需要新建一個與查詢結果對應的實體類,或者直接使用map結果集
2,sql語句 String sql="select {s.*} from grade s,student st where s.id=st.classid"
針對這樣的全部欄位查詢的sql可以利用addEntity來轉化為實體類
SQLQuery query=session.createSQLQuery(sql) ;
query.addEntity("s", Grade.class);
SQL查詢語句,它帶一個佔位符,可以讓Hibernate使用欄位的別名.
查詢返回的實體,和它的SQL表的別名.
addEntity()方法將SQL表的別名和實體類聯系起來,並且確定查詢結果集的形態。
這樣就可以將班級這張表裡面的所有欄位的值賦值給班級這個實體類java培訓機構排名,而且必須是所有的屬性
3,sql語句 String sql="select {s.*},{st.*} from grade s,student st where s.id=st.classid"
SQLQuery query=session.createSQLQuery(sql) ;
query.addEntity("s", Grade.class);
query.addEntity("st", Student.class);
利用這樣的查詢得到的是一個object[]數組,object[0]就是班級實體類,object[1]就是學生實體類
可以用addScalar(String arg,Type type)方法定義要返回的欄位類型,如
s.createSQLQuery(shuiQingHQL).addScalar("STCD",Hibernate.STRING).addScalar("STNM")
⑥ 在hibernate中寫了一條多表聯查sql語句,可是沒有返回對象,怎麼接值並把它遍歷出來
你得到的是一個list<object[]>的東西,你循環遍歷就好了
for(object[] o : list){
Object[] obj = o;
......然後在取出這個數組中你想要的值
}
⑦ 怎樣將hibernate的sql查詢結果集轉換為pojo對象結果集
給你這樣說吧:Hibernate提供了多種查詢數據的方法。通常情況下,使用select子句查詢的結果是集合,而集合元素就是select後的實例、屬性等組成的數組。
在特殊情況下,如果select後只有一項(包括持久化實例或屬性),則查詢到元素就是該持久化實例或者屬性。
如果select後多個項,則每個集合元素就是選擇出的多項組成的數組!
這就是原理,在您使用「用createNativeQuery(sql,object.class).getResultList 帶個對象類型就行 」這個就行是應該知道其中的原理。
⑧ hibernate實體類用了注釋,使用createSQLQuery()調用存儲結構,能取到對象但是不能轉型。
其實得到的對象是一個List<Object> 其中的 Object 是一個 Object數組 一個Object數組 表示你查詢到的一條記錄,但是這些都只是值,sqlQuery不會自動幫你封裝實體對象。
你在執行查詢方法的時候hibernate將數據查詢到後放在堆中 然後list指向。
當你調用list的時候 他就會想堆中的List<Object>去轉換成Bean對象 Object數組怎麼可能轉換成實體類 所以報錯, 唯一的方法 只能你自己循環做處理。
⑨ 在hibernate中能用sql進行增刪改嗎
覺得可以
jdbc操作的是數據 也就是sql
hibernate操作的是對象 用hql(操作實體類的對象)
例如String hql="from User(這里的User是個實體類) where name(為User類的一個屬性)=? ";
可以通過query.setString(0,具體?的值);來對?進行賦值
你查詢也是查的對象
hql :
增:session.save();
刪:首要要寫一個方法findUserById();用來查詢特定的對象
查找到你要刪除的對象然後session.delete(user);
改:找到葯修改的對象 對其屬性重新賦值之後
session.saveOrUpdate(user);即可!
⑩ hibernate查詢資料庫時採用sql查詢得出的結果沒有對象名稱,該怎麼解決呢
1、查看自己寫的語句,沒有絲毫的錯誤。放到SQL查詢分析器執行。也能檢索出數據。
這確保了這條語句是沒錯的。
提示:Hibernate中的SQL語句是不區分大小寫的,即便是你查詢的表名。比如你寫成這
樣也是合法的
"SEleCt
*
fRoM
ClaSSes
"。那麼Hibernate怎樣操作對象?問題的關鍵
是這里sQuery.addEntity(Classes.class);這條語句,
你要正確填寫你要檢索的表的
實體,它必須是你存在的POJO。
2、使用Hibernate官方推薦的HQL查詢,同樣的資料庫,同樣的表。結果是正確的。這
確保了資料庫鏈接是絕對沒有問題的。
3、仔細檢查我寫的SQL查詢方法,沒有發現什麼語法錯誤。
4、檢查我查詢表的POJO對象的映射文件.XXX.hbm.xml
,主鍵生成方式是
native
。似
乎也沒有錯誤。
5、檢查資料庫檢索表的主鍵,也已經設成自動增長。