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
    评论
使用Hibernate Native Query查询并返回DTO的步骤如下: 1. 创建一个DTO类,它包含你想要返回的字段的属性。 ```java public class UserDTO { private int id; private String username; private String email; // getters and setters } ``` 2. 编写一个SQL查询,使用Hibernate Native Query执行查询,并将结果映射到DTO对象中。 ```java String sql = "SELECT id, username, email FROM users WHERE id = :id"; Query query = session.createNativeQuery(sql) .setParameter("id", id) .setResultTransformer(Transformers.aliasToBean(UserDTO.class)); UserDTO user = (UserDTO) query.uniqueResult(); ``` 在这个例子中,我们编写了一个SQL查询,并使用Hibernate Native Query执行查询。我们使用setParameter方法设置查询参数,并使用setResultTransformer方法将查询结果映射到UserDTO对象中。 Transformers.aliasToBean方法是一个Transformer实现,它可以将查询结果自动映射到一个JavaBean对象中。在这里,我们将UserDTO.class传递给这个方法,表示将查询结果映射到UserDTO对象中。 3. 在Java代码中,使用Hibernate Session执行查询。 ```java Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); UserDTO user = null; try { String sql = "SELECT id, username, email FROM users WHERE id = :id"; Query query = session.createNativeQuery(sql) .setParameter("id", id) .setResultTransformer(Transformers.aliasToBean(UserDTO.class)); user = (UserDTO) query.uniqueResult(); tx.commit(); } catch (Exception e) { if (tx != null) { tx.rollback(); } e.printStackTrace(); } finally { session.close(); } ``` 在这个例子中,我们使用Hibernate Session打开一个数据库会话,并在try-catch-finally块中执行查询。我们使用createNativeQuery方法创建一个Hibernate Native Query对象,并使用setParameter和setResultTransformer方法设置查询参数和结果转换器。最后,我们使用uniqueResult方法获取查询结果,并提交或回滚事务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值