Hibernate的SQLQuery与Query占位符传参
来源:互联网 发布:mac官网口红价格 编辑:程序博客网 时间:2024/06/05 10:21
Hibernate支持SQLQuery(特定数据库平台有关的sql语句)和Query(hql)查询方式,当然还有Criteria对象查询方式;本文介绍SQLQuery和Query的几种传参的方式和注意事项;
SQLQuery
1、查询结果映射到map,:param传参
public List<Map<String, Object>> findMapBySql(String sql, Map<String, Object> params) { SQLQuery sqlQuery = this.getCurrentSession().createSQLQuery(sql); sqlQuery=getSqlQueryByMap(sqlQuery,params); return sqlQuery.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP).list(); } public SQLQuery getSqlQueryByMap(SQLQuery sqlQuery,Map<String,Object> params){ if (params != null && !params.isEmpty()) { for (String key : params.keySet()) { Object obj = params.get(key); if (obj instanceof Collection<?>) sqlQuery.setParameterList(key, (Collection<?>) obj); else if (obj instanceof Object[]) sqlQuery.setParameterList(key, (Object[]) obj); else sqlQuery.setParameter(key, obj); } } return sqlQuery; }
返回的数据是一个map类型的列表,参数通过map传递,参数类型为:param;
调用示例:
String sql="select id,user_name,create_date_time from tbl_user where code=:code"Map<String,Object> params=new HashMap<>();params.put("code","test");List<Map<String,Object>> users=this.findMapBySql(sql,params);
如果需要转化为实体的集合,需要自己处理
2、查询结果映射到实体,:param传参
public <T> List<T> find(String sql, Map<String,Object> params, Class<T> clazz) { SQLQuery query = this.getCurrentSession().createSQLQuery(sql); query=getSqlQueryByMap(query,params); query.setResultTransformer(Transformers.aliasToBean(clazz)); return query.list(); }
返回的数据是一个实体的列表,参数通过map传递,参数类型为:param,需要注意的是,数据库字段必须和映射的实体字段一一对应,而且存在getter/setter方法,不然会报错。
调用示例:
String sql="select id,user_name,create_date_time from tbl_user where code=:code"Map<String,Object> params=new HashMap<>();params.put("code","test");List<User> users=this.find(sql,params,User.class);
则需要User实体中有user_name,create_date_time的属性定义,而不是userName,createDateTime,当然可以通过制定别名解决这个问题;
还有如下的一种方式,也可以获取实体列表
public <T> List<T> findBySql(String sql, Class<T> clazz) { SQLQuery sqlQuery = this.getCurrentSession().createSQLQuery(sql); sqlQuery.addEntity(clazz); return sqlQuery.list(); }
同样是获取实体列表,下面的方式是将找到数据库字段名对应的实体属性名,比如sql->user_name会映射到entity->userName,
注意:
@Transient的实体是不会赋值的,对应的查询结果不会注入到entity;
3、查询结果映射到map或实体,?传参
public List findMapBySql(String sql, Object[] params, Type[] types, Class clazz) { SQLQuery query = this.getCurrentSession().createSQLQuery(sql); if (clazz != null) { query.setResultTransformer(Transformers.aliasToBean(clazz)); } else { query.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP); } query.setParameters(params, types); return query.list(); }
返回的数据是一个列表,根据clazz参数判断返回的map类型的列表还是实体列表,参数使用了?
占位符,在集合参数中比如in
,需要用多个?
代替;
调用示例:
String sql="select id,user_name,create_date_time from tbl_user where code like ? and id in (?,?,?)"Object[] params=new Object[]{"%test%",1,3,5};Type[] types=new Type[]{Hibernate.String,Hibernate,Integer,Hibernate.Integer,Hibernate.Integer};List<Map<String,Object>> users=this.findMapBySql(sql,params,types,null);
Query
通过HQL语句查询数据,查询结果也同SQLQuery类型:
- 支持setResultTransformer把查询结果映射到实体列表或者map列表
- 支持通过setParameters(?传参)
- setParameter/setParameterList(:param传参)
- 不支持addEntity映射到实体(因为hql本文是和实体绑定的)
此外,Hiberante查询还支持Criteria和Example两种方式;
3 0
- Hibernate的SQLQuery与Query占位符传参
- hibernate中query和sqlquery的区别
- hibernate SQLQuery & Query
- hibernate (SQLQuery)query.setResultTransformer
- Hibernate 入门----Query,Criteria,SQLQuery
- Hibernate 使用Query、SQLQuery 的setCacheable()设置缓存问题
- Hibernate的SQLQuery
- hibernate中SQLQuery的addEntity()
- Hibernate中的Query对象,Criteria对象和SQLQuery对象
- hibernate sqlQuery
- hibernate SQLQuery
- hibernate sqlQuery
- hibernate中SQLQuery的addEntity();方法
- hibernate中SQLQuery的addEntity();方法
- hibernate中SQLQuery的addEntity();方法
- hibernate中SQLQuery的addEntity();方法
- Hibernate SQLQuery.addEntity的使用示例
- hibernate的query.iterate()与query.list()的区别(四)
- tp缓存
- echarts-日历图
- C++学习笔记:复合类型
- 取模和取余的区别
- 靠意志力的学习都是耍流氓
- Hibernate的SQLQuery与Query占位符传参
- 开发中遇到的问题--java.lang.IllegalStateException
- Spring MVC文件上传下载实践
- Storm Tick
- 织梦去除无效内容以及添加有效内容
- 支持上下拉刷新的RecycleView,基于androidPullToRefresh,添加RecycleView HeaderView
- Retrofit2.0源码解析(简版)
- 下载Windows版本的Redis
- 二叉树的最大节点