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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值