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())的值即可