1. 程式人生 > >Hibernate中sql查詢返回不受Hibernate管理的實體

Hibernate中sql查詢返回不受Hibernate管理的實體

Hibernate查詢有好多種方法,當我們需要查詢自己構建的實體時,需要使用session.createSQLQuery(sql)方法查詢實體,但這樣只能返回由Hibernate管理的實體,即生成資料庫表的那些實體,為了返回任意的自定義的實體,我們需要這樣做:

sess.createSQLQuery("SELECT NAME,BIRTHDATE FROM CATS") .setResultTransformer(Transformers.aliasToBean(CatDTO.class))

這個查詢指定:

SQL查詢字串

結果轉換器(result transformer)

上面的查詢將會返回CatDTO的列表,它將被例項化並且將NAME和BIRTHDAY的值注射入對應的屬性或者欄位。

注:

我們使用如下查詢語句

Query q = session.createSQLQuery("select classify.classifyName as classifyName,count(*)as count from note,classify "

                   +"where note.classifyId =classify.classifyId GROUP BY(classifyName)")

               .setResultTransformer(Transformers.aliasToBean(ClassifyStatistics.class

));

因為不同的Hibernate版本對count(*)返回值型別不一樣,且不同資料庫的返回值也不一樣,所以為了適配不同的資料庫,我們可以這樣做:

Query q = session.createSQLQuery("select classify.classifyName asclassifyName,count(*) as count from note,classify "

                   +"where note.classifyId =classify.classifyId GROUP BY(classifyName)");

               /*.setResultTransformer(Transformers.aliasToBean(ClassifyStatistics.class));*/

            List<Object[]>objects = q.list();

            List<ClassifyStatistics>classifys = newArrayList<ClassifyStatistics>();

            for(Object[] result :objects) {

                ClassifyStatisticsstatistics = newClassifyStatistics();

                statistics.setClassifyName((String)result[0]);

                statistics.setCount(((Number)result[1]).intValue());

                classifys.add(statistics);

            }

先生成物件陣列,然後在轉換成Number,之後獲取指定型別(initValue())的值即可