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

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

示例1:名字参数
public void entityQuery(){
Seesion session=HibernateUtil.currentSession();
Transaction tx=session.beginTransaction();
String sqlString="Select * From strudent Where year =:year";
List l=session.createSQLQuery(sqlString)
.addEntity(Strudent.class)
.setParameter("year",2015)
.list();
tx.commit();
HibernateUtil.closeSession();
}
示例2:问号(?)参数
  public void listInstalledOrUn() {
try {
StringBuilder mysql = new StringBuilder();
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 ");
List<Object> getParamList = new ArrayList<Object>();
createSQLWhereCondition(mysql, getParamList);
GridData<ReportLog> gridData = reportLogService.getPageView(mysql.toString(), getParamList, getPageNum(), getPageSize());
print(ActionUtil.jsonObj(gridData));
} catch (Exception e) {
log.info("获取列表失败");
e.printStackTrace();
}
}
   private void createSQLWhereCondition(StringBuilder mysql, List<Object> getParamList) {
if (StringUtils.isNotBlank(userName)) {
mysql.append(" AND c.name LIKE ? ");
getParamList.add("%" + userName + "%");
}
if (StringUtils.isNotBlank(ip)) {
mysql.append(" AND p.ip LIKE ? ");
getParamList.add("%" + ip + "%");
}
if (StringUtils.isNotBlank(mac)) {
mysql.append(" AND p.mac LIKE ? ");
getParamList.add("%" + mac + "%");
}
if (StringUtils.isNotBlank(version)) {
mysql.append(" AND VERSION LIKE ? ");
getParamList.add("%" + version + "%");
}
if (StringUtils.isNotBlank(type)) {
mysql.append(" AND TYPE=?");
getParamList.add(type);
}
if (StringUtils.isNotBlank(startTime)) {
mysql.append("AND TIME >=?");
getParamList.add(startTime);
}
if (StringUtils.isNotBlank(endTime)) {
mysql.append("AND TIME <=?");
getParamList.add(endTime);
}
}
方法getPageView:
  @SuppressWarnings("unchecked")
    @Override
    public GridData<ReportLog> getPageView(String sql, List<Object> getParamList, int pageNum, int pageSize) {
        List<Object> paramList = getParamList;         // 一、查询总记录数
        // 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));
        }         // b, 查询出总记录数
        int recordCount = countQuery.list().size();         // 计算总页数
        int maxPageNum = (recordCount + pageSize - 1) / pageSize;
        if (pageNum > maxPageNum)
            pageNum = maxPageNum;         List<ReportLog> recordlist = null;
        if (recordCount > 0) {
            // ===============
            // 二、查询指定页的数据列表
            // a, 生成查询recordList的Query对象,并设置参数
            countQuery.setFirstResult((pageNum - 1) * pageSize);
            countQuery.setMaxResults(pageSize);             // b, 查询出当前页的数据列表
            recordlist = countQuery.list();
        }         return new GridData<ReportLog>(recordCount, recordlist);
    }
package com.vrv.paw.bean;

import java.io.Serializable;
import java.util.List; /**
* JavaBean:代表UI的一个网格*/
public class GridData<T> implements Serializable {
private static final long serialVersionUID = 1L; /** 总行数 **/
private int total;
/** 行数据 **/
private List<T> rows; public GridData() { } public GridData(int total, List<T> rows) {
this.total = total;
this.rows = rows;
} public int getTotal() {
return total;
}
public void setTotal(int total) {
this.total = total;
}
public List<T> getRows() {
return rows;
}
public void setRows(List<T> rows) {
this.rows = rows;
} }

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

public void multiEntityQuery(){
Session session=HibernateUtil.currentSession();
Transaction tx=session.beginTransaction();
String sql="Select s.*,e.*,c.* From student s,enrolment e,course c Where s.id=e.id And e.code=c.code ";
List l=session.createSQLQuery(sql)
.addEntity("s",Student.class)
.addEntity("e",Enrolment.class)
.addEntity("c",Course.class)
.list();
tx.commit();
HibernateUtil.closeSession();
}

在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. Python(socket编程——1、理论)

    Socket的英文原义是“孔”或“插座”.作为BSD UNIX的进程通信机制,取后一种意思.通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机 ...

  2. openURL的使用

    1)私有方法跳转 /** 私有方法,不建议使用 利用ASCII值进行拼装组合方法.这样可绕过审核. 上面是进入蓝牙界面的方法.也可以有其他的页面可以跳转.设置页面是@"@"Pref ...

  3. 2016-2017 ACM-ICPC Southwestern European Regional Programming Contest (SWERC 2016) B - Bribing Eve

    地址:http://codeforces.com/gym/101174/attachments 题目:pdf,略 思路: 把每个人的(x1,x2)抽象成点(xi,yi). 当1号比i号排名高时有==& ...

  4. “凯易迅Calix”实习上机——求元音开头辅音结尾的子串

    题目要求: 对于一个输入的字符串(26个小写字母组成),求出他的所有子串中元音开头,辅音结尾的子串.在这所有的子串中,输出第一个和最后一个. 例如aab,共有子串a,aa,aab,ab,b:但是满足元 ...

  5. iOS开发之NSUserDefaults

    在ios中偏好设置保存用户配置的对象 //NSUserDefaults读取 //获取标准函数对象 //通过对象获取名称下NSMutableDictionary数据 NSUserDefaults *de ...

  6. Django学习笔记之Django ORM相关操作

    一般操作 详细请参考官方文档 必知必会13条 <> all(): 查询所有结果 <> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 <> ...

  7. axios配置大全

    一.安装 1. 利用npm安装npm install axios --save 2. 利用bower安装bower install axios --save 3. 直接利用cdn引入<scrip ...

  8. 20145310《Java程序设计》第3次实验报告

    20145310<Java程序设计>第3次实验报告 实验内容 使用 git 上传代码 使用 git 相互更改代码 实现代码的重载 实验步骤 首先使用git设置用户名和ssh公钥 使用git ...

  9. LeetCode——Is Subsequence

    Question Given a string s and a string t, check if s is subsequence of t. You may assume that there ...

  10. ADO.NET 使用DELETE语句批量删除操作,提示超时,删除失败,几种优化解决思路

    起因是如此简单的一句sql 提示:Timeout 时间已到.在操作完成之前超时时间已过或服务器未响应. 提供几种解决思路: 1.检查WHERE条件中字段是否已建索引 2.检查是否被其他表引用,引用表外 ...