1、在SQLQuery.addScalar 时,查询结果集List<Object[]> ,Object[]数组中的顺序同addScalar的顺序是一致的。
且使用addScalar的话,查询结果的每个字段都需要增加,否则结果为NULL,都需要大写
SQLQuery query = getSession().createSQLQuery(nativeSql); if(scalarList!=null&&scalarList.size()>0){ for(Entry<String, Type> entry : scalarList){ query.addScalar(entry.getKey(), entry.getValue()); } }
String nativeSql = "SELECT ID as ID,name as NAME,LOGIN_NAME as LOGINNAME,CREATE_TIME as TIME FROM T_USER WHERE LOGIN_NAME=?"; List<Entry<String, Type>> scalarList = new ArrayList<Entry<String,Type>>(); Map<String, Type> map = new HashMap<String, Type>(); //hibernate4写法 map.put("ID", LongType.INSTANCE); map.put("NAME", StringType.INSTANCE); map.put("LOGINNAME", StringType.INSTANCE); map.put("TIME", DateType.INSTANCE); scalarList.addAll(map.entrySet()); List<Map> rs = dao.findNativeQuery(nativeSql, -1, -1, scalarList, new Object[]{"vinfai"});
通过Map.entrySet()导致scalarList无序,结果不能通过Object[i]的形式来取的,因为类型无法确定。
解决方法:1、确定scalarList的次序
2、设置Transformer属性,则可将放回的结果的每一行放到MAP中(List<Map>),KEY:为DB中名称一致,或者别名 query.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
通过MAP形式读取.
Map map1 = (Map)rs.get(i); Long id = (Long)map1.get("ID"); String name = (String)map1.get("name"); String loginName = (String)map1.get("LOGINNAME"); Date createTime = (Date)map1.get("TIME");
2、oracle的char字段在hibernate里映射为character类型,是varchar的子集。
可通过设置scalar解决
3、复杂SQL用createSQLQuery方法查询没问题,如果查询多个字段,遍历用object[]造型,下标从0开始输出值,不需要映射文件;如果愿意可以写一个映射bean,方便取用。
query.setResultTransformer(Transformers.aliasToBean(Person.class)));
PS:有任何错误,请大家批评指正,谢谢!