Hibernate的SQLQuery与Query占位符传参,亲测有用

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 AS \"userName\",create_date_time AS \"createDateTime\" 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);

hibernate:则需要User实体中有userName,createDateTime的属性定义,user_name等下划线是不识别的,查出来是空.

User实体需要有@Entity注解,当只需要查询时,是不需要建表的!

还有如下的一种方式,也可以获取实体列表

 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类型:

1.支持setResultTransformer把查询结果映射到实体列表或者map列表
2.支持通过setParameters(?传参)
3.setParameter/setParameterList(:param传参)
4.不支持addEntity映射到实体(因为hql本文是和实体绑定的)
此外,Hiberante查询还支持Criteria和Example两种方式;
 

参考文章:https://blog.csdn.net/jrn1012/article/details/70255552/,亲测有用

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值