使用原生SQL查询必须注意:程序必须选出所有的数据列才可被转换成持久化实体。
假设实体在映射时有一个<many-to-one../>的关联指向另外一个实体,则SQL查询中必须返回该<many-to-one../>映射的外键列,否则将导致抛出"column not found"异常。最简单的做法是,在SQL字符串中使用星(*)来表示返回所有列。
    在原生SQL语句中一样支持使用参数,这些参数即可使用问号参数(?),也可使用名字参数。

实战技巧:优化使用名字参数的形式,因为问号参数已经过时

  1. 示例1:名字参数
    public void entityQuery(){
  2. Seesion session=HibernateUtil.currentSession();
  3. Transaction tx=session.beginTransaction();
  4. String sqlString="Select * From strudent Where year =:year";
  5. List l=session.createSQLQuery(sqlString)
  6. .addEntity(Strudent.class)
  7. .setParameter("year",2015)
  8. .list();
  9. tx.commit();
  10. HibernateUtil.closeSession();
  11. }
  1. 示例2:问号(?)参数
      public void listInstalledOrUn() {
  2. try {
  3. StringBuilder mysql = new StringBuilder();
  4. mysql.append("SELECT t.*,c.*,p.* FROM (SELECT * FROM vrv_paw_reportlog WHERE TYPE IN(1001,1002) GROUP BY pcInfoId ORDER BY TIME DESC) "
               +"t INNER JOIN vrv_paw_cloudaccount c ON t.cloudAccountId=c.id INNER JOIN vrv_paw_pcinfo p ON t.pcInfoId=p.id WHERE 1=1 ");
  5. List<Object> getParamList = new ArrayList<Object>();
  6. createSQLWhereCondition(mysql, getParamList);
  7. GridData<ReportLog> gridData = reportLogService.getPageView(mysql.toString(), getParamList, getPageNum(), getPageSize());
  8. print(ActionUtil.jsonObj(gridData));
  9. } catch (Exception e) {
  10. log.info("获取列表失败");
  11. e.printStackTrace();
  12. }
  13. }
  14.    private void createSQLWhereCondition(StringBuilder mysql, List<Object> getParamList) {
  15. if (StringUtils.isNotBlank(userName)) {
  16. mysql.append(" AND c.name LIKE ? ");
  17. getParamList.add("%" + userName + "%");
  18. }
  19. if (StringUtils.isNotBlank(ip)) {
  20. mysql.append(" AND p.ip LIKE ? ");
  21. getParamList.add("%" + ip + "%");
  22. }
  23. if (StringUtils.isNotBlank(mac)) {
  24. mysql.append(" AND p.mac LIKE ? ");
  25. getParamList.add("%" + mac + "%");
  26. }
  27. if (StringUtils.isNotBlank(version)) {
  28. mysql.append(" AND VERSION LIKE ? ");
  29. getParamList.add("%" + version + "%");
  30. }
  31. if (StringUtils.isNotBlank(type)) {
  32. mysql.append(" AND TYPE=?");
  33. getParamList.add(type);
  34. }
  35. if (StringUtils.isNotBlank(startTime)) {
  36. mysql.append("AND TIME >=?");
  37. getParamList.add(startTime);
  38. }
  39. if (StringUtils.isNotBlank(endTime)) {
  40. mysql.append("AND TIME <=?");
  41. getParamList.add(endTime);
  42. }
  43. }
  1. 方法getPageView
      @SuppressWarnings("unchecked")
        @Override
        public GridData<ReportLog> getPageView(String sql, List<Object> getParamList, int pageNum, int pageSize) {
            List<Object> paramList = getParamList;
  2.  
  3.         // 一、查询总记录数
            // a, 生成查询recordCount的Query对象,并设置参数
            Query countQuery = this.getSession().createSQLQuery(sql).addEntity(ReportLog.class);
            for (int i = 0; i < paramList.size(); i++) {
                countQuery.setParameter(i, paramList.get(i));
            }
  4.  
  5.         // b, 查询出总记录数
            int recordCount = countQuery.list().size();
  6.  
  7.         // 计算总页数
            int maxPageNum = (recordCount + pageSize - 1) / pageSize;
            if (pageNum > maxPageNum)
                pageNum = maxPageNum;
  8.  
  9.         List<ReportLog> recordlist = null;
            if (recordCount > 0) {
                // ===============
                // 二、查询指定页的数据列表
                // a, 生成查询recordList的Query对象,并设置参数
                countQuery.setFirstResult((pageNum - 1) * pageSize);
                countQuery.setMaxResults(pageSize);
  10.  
  11.             // b, 查询出当前页的数据列表
                recordlist = countQuery.list();
            }
  12.  
  13.         return new GridData<ReportLog>(recordCount, recordlist);
        }
  1. package com.vrv.paw.bean;
  2.  
  3. import java.io.Serializable;
  4. import java.util.List;
  5.  
  6. /**
  7. * JavaBean:代表UI的一个网格*/
  8. public class GridData<T> implements Serializable {
  9. private static final long serialVersionUID = 1L;
  10.  
  11. /** 总行数 **/
  12. private int total;
  13. /** 行数据 **/
  14. private List<T> rows;
  15.  
  16. public GridData() {
  17.  
  18. }
  19.  
  20. public GridData(int total, List<T> rows) {
  21. this.total = total;
  22. this.rows = rows;
  23. }
  24.  
  25. public int getTotal() {
  26. return total;
  27. }
  28. public void setTotal(int total) {
  29. this.total = total;
  30. }
  31. public List<T> getRows() {
  32. return rows;
  33. }
  34. public void setRows(List<T> rows) {
  35. this.rows = rows;
  36. }
  37.  
  38. }

不仅如此,如果在SQL语句中显示使用了多表连接,则SQL语句可以选出多个数据表的数据。Hibernate还支持将查询结果转换成多个实体。如果要将查询结果转换成多个实体,则SQL字符串中应为不同数据表指定不同别名,并调用addEntity(String alias,Class entityClass)方法将不同数据表转换程不同实体。

  1. public void multiEntityQuery(){
  2. Session session=HibernateUtil.currentSession();
  3. Transaction tx=session.beginTransaction();
  4. String sql="Select s.*,e.*,c.* From student s,enrolment e,course c Where s.id=e.id And e.code=c.code ";
  5. List l=session.createSQLQuery(sql)
  6. .addEntity("s",Student.class)
  7. .addEntity("e",Enrolment.class)
  8. .addEntity("c",Course.class)
  9. .list();
  10. tx.commit();
  11. HibernateUtil.closeSession();
  12. }

在Hibernate中使用原生SQL语句的更多相关文章

  1. Django中执行原生SQL语句【新编辑】

    参考我的个人博客 这部分迁移到了个人博客中:Django中执行原生SQL语句 这里需要补充一下,还有一个extra方法: ret = models.Student.objects.all().extr ...

  2. thinkPHP框架中执行原生SQL语句的方法

    这篇文章主要介绍了thinkPHP框架中执行原生SQL语句的方法,结合实例形式分析了thinkPHP中执行原生SQL语句的相关操作技巧,并简单分析了query与execute方法的使用区别,需要的朋友 ...

  3. django系列5.4--ORM中执行原生SQL语句, Python脚本中调用django环境

    ORM执行原生sql语句 在模型查询API不够用的情况下,我们还可以使用原始的SQL语句进行查询. Django 提供两种方法使用原始SQL进行查询:一种是使用raw()方法,进行原始SQL查询并返回 ...

  4. JPA或Hibernate中使用原生SQL实现分页查询、排序

    发生背景:前端展示的数据需要来自A表和D表拼接,A表和D表根据A表的主键进行关联,D表的非主键字段关联C表的主键,根据条件筛选出符合的数据,并且根据A表的主键关联B表的主键(多主键)的条件,过滤A表中 ...

  5. 在django中使用原生sql语句

    raw # row方法:(掺杂着原生sql和orm来执行的操作) res = CookBook.objects.raw('select id as nid from epos_cookbook whe ...

  6. 043:Django使用原生SQL语句操作数据库

    Django使用原生SQL语句操作数据库 Django配置连接数据库: 在操作数据库之前,首先先要连接数据库.这里我们以配置 MySQL 为例来讲解. Django 连接数据库,不需要单独的创建一个连 ...

  7. java:Hibernate框架3(使用Myeclipse逆向工程生成实体和配置信息,hql语句各种查询(使用hibernate执行原生SQL语句,占位符和命名参数,封装Vo查询多个属性,聚合函数,链接查询,命名查询),Criteria)

    1.使用Myeclipse逆向工程生成实体和配置信息: 步骤1:配置MyEclipse Database Explorer: 步骤2:为项目添加hibernate的依赖: 此处打开后,点击next进入 ...

  8. Django中使用mysql数据库并使用原生sql语句操作

    Django自身默认使用sqlite3这个轻量级的数据库,但是当我们开发网站时,sqlite3就没有mysql好,sqlite3适合一些手机上开发使用的数据库. 准备的软件mysql数据库,版本5.7 ...

  9. 关于No Dialect mapping for JDBC type :-9 hibernate执行原生sql语句问题

    转自博客http://blog.csdn.net/xd195666916/article/details/5419316,同时感谢博主 今天做了个用hibernate直接执行原生sql的查询,报错No ...

随机推荐

  1. .net:Code First 创建或更新数据库

    控制台输入命令: 切换到项目的project.json 文件所在文件 dotnet ef migrations add XXX dotnet ef database update Visual Stu ...

  2. oracle 将当前系统时间戳插入timestamp字段

    oracle 将当前系统时间戳插入timestamp字段 --insert records 精确到秒:insert into userlogin_his(usrname,logintime) valu ...

  3. 条件编译#ifdef的妙用详解

    c语言中条件编译相关的预编译指令,包括  #define.#undef.#ifdef.#ifndef.#if.#elif.#else.#endif.defined. #define           ...

  4. SQL执行并返回执行前/后结果

    SQLServer: 1.插入数据,并返回插入的数据: INSERT INTO TestTB(Province,City) output inserted.Province, inserted.Cit ...

  5. Web安全学习笔记之Kali部署DVWA和OWASPBWA

    0x0 前言 kali安装完成,下面要进行实战操作了,喵~~(OWASPBWA请直接跳到第八部分) #既然你诚心诚意的问了,我们就大发慈悲的告诉你! #为了防止世界被破坏! #为了守护世界的和平! # ...

  6. CSS 图片

    CSS 图片 一.圆角图片 img { border-radius: 8px; } 二.缩略图 border 属性来创建缩略图. img { border: 1px solid #ddd; borde ...

  7. MVC 4中的前端渲染 @Helper指令

    如果我们需要在一个页面或多个页面显示如人民币格式(后台传回来的无¥)¥的格式化.或是对后台数据作如保留小数个数等处理,这些东西经常要用到,特别是一些NULL值的处理,有可能会出错.这时我们可以通过创建 ...

  8. 编码解码--url编码解码

    url编码解码,又叫百分号编码,是统一资源定位(URL)编码方式.URL地址(常说网址)规定了常用地数字,字母可以直接使用,另外一批作为特殊用户字符也可以直接用(/,:@等),剩下的其它所有字符必须通 ...

  9. Qt、MVB

    使用的陪测网卡是[众志诚MVB网卡],通过串口配置,可以接收和发送MVB数据. 一.MVB通信介绍 对于某一节点[如众志诚MVB网卡],为其配置0x710和0x720端口为源端口,用于发送数据,为其配 ...

  10. static变量、static方法之间的异同

        private SchemeBean getEmptyScheme() {        SchemeBean scheme = new SchemeBean();        scheme ...