Hibernate native SQL 查询总结

 


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:有任何错误,请大家批评指正,谢谢!

 

你可能感兴趣的:(Hibernate)