Hibernate運行原生sql並將查詢的結果轉化為對象


原生SQL查詢執行的控制是通過SQLQuery接口進行的,通過執行Session.createSQLQuery()獲取這個接口。下面來描述如何使用這個API進行查詢。
標量查詢(Scalar queries)
最基本的SQL查詢就是獲得一個標量(數值)的列表。
sess.createSQLQuery("SELECT * FROM CATS").list();
sess.createSQLQuery("SELECT ID, NAME, BIRTHDATE FROM CATS").list();
它們都將返回一個Object數組(Object[])組成的List,數組每個元素都是CATS表的一個字段值。Hibernate會使用ResultSetMetadata來判定返回的標量值的實際順序和類型。
如果要避免過多的使用ResultSetMetadata,或者只是為了更加明確的指名返回值,可以使用addScalar()。

sess.createSQLQuery("SELECT * FROM CATS")
        .addScalar("ID", StandardBasicTypes.LONG)
        .addScalar("NAME", StandardBasicTypes.STRING)
        .addScalar("BIRTHDATE", StandardBasicTypes.DATE)
這個查詢指定了:
SQL查詢字符串
要返回的字段和類型


注意:在query中加上 setResultTransformer(Transformers.aliasToBean(clazz));
這里的clazz表示的是傳入的自定義的bean.class ,這里的bean是自己封裝的,不需要有映射文件,如果使用query = getSession().createSQLQuery(sql).addEntity(clazz); 需要bean具有映射文件
query = getSession().createSQLQuery(sql).setResultTransformer(Transformers.aliasToBean(clazz));

當對象的屬性類型與查詢出來的字段類型不一致時,可以通過addScalar("smallclass_id", StandardBasicTypes.INTEGER)  這個方法進行設置,第一個參數是字段名稱,第二個參數是對象的類型,但是:當使用了addScalar時,所有的查詢的字段都需要重新設置類型,否則不設置的字段查詢出來值為null,例如:
Query query=getCurrent().createSQLQuery(sql).addScalar("smallclass_id", StandardBasicTypes.INTEGER).addScalar("smallclassrights",StandardBasicTypes.INTEGER).setResultTransformer(new AliasToBeanResultTransformer(SmallClass.class))

封裝到SmallClass中的屬性只有smallclass_id和smallclassrights兩個字段是有值的,如果存在第三個屬性,則封裝到對象中值為null
---------------------
作者:飛天武者
來源:CSDN
原文:https://blog.csdn.net/hhua5230/article/details/79923678
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM