在Hibernate中使用原生SQL语句

使用原生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();
}
时间: 2024-08-05 02:26:52

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

django中使用原生SQL语句

views中代码: # 有多个数据库时 from django.db import connections # 傳入游标,得到字典結果集 def dictfetchall(cursor): "将游标返回的结果保存到一个字典对象中" desc = cursor.description return [ dict(zip([col[0] for col in desc], row)) for row in cursor.fetchall() ] def seldata(request):

django 使用原生SQL语句反向生成MODELS.PY中的表结构

在一次工作中,有这么一个问题,就是要导入的数据字段不确定,但是还想使用django的ORM来对数据进行操作.. 琢磨了许久,弄个不完善的方案,但功能是能实现的,主要是思路.废话不多说了,丑陋的展示一下吧... from django.db import connection #粗陋的用数组和字符串表示一下要导入的数据表单项lis = ['ll', 'bb', 'yy'] #表示要建立的表单字段l = 'tablename' #表名ll = 'fff' new_table = connection

entityframework学习笔记--009-使用原生sql语句操作数据

1 使用原生SQL语句更新--Database.ExecuteSqlCommand 假设你有一张如图9-1所示的Payment数据库表. 图9-1 1.1 实体类型: 1 public class Payment 2 { 3 public int PaymentId { get; set; } 4 public decimal Amount { get; set; } 5 6 public string Vendor { get; set; } 7 } 1.2 数据访问类: 1 public c

机房收费系统中遇到的SQL语句问题

个人版机房收费系统正在进行中,遇到了几个有关SQL语句的问题. 1.sum函数的使用: 在结账部分,要求出某个表中某一列的和.在第一次机房系统中,我不知道sum函数的存在,很傻很天真地用循环一个一个往上加.下面以求所有卡中余额的和来说说sum函数怎么使,SQL语句为:select sum(cash)from T_Card.这个格式不是固定的,可以根据需求更改,比如求多列的和:select sum(列名1),sum(列名2)...from [表名] where....查询出来的结果只有一行,如果只

SQL*PLUS中批量执行SQL语句

SQL*PLUS中批量执行SQL语句 今天由于工作的需要,要在CMD中批量执行大量的SQL语句,对于Oracle学习还处在入门阶段的我,只能硬着头皮到处去寻找资料(主要是网络资料,也包括自己的电子书),最后将所有的SQL语句一次性的执行完成. 首先,将要执行的所有的SQL语句,全部写入某个sql文件当中.例如f:\test.sql; 然后,通过通过sqlplus连接到数据库:如: SQL> sqlplus test/[email protected]; 再执行如下命令: SQL> @f:\te

django中使用原生sql

在Django中使用原生Sql主要有以下几种方式: 一:extra:结果集修改器,一种提供额外查询参数的机制 二:raw:执行原始sql并返回模型实例 三:直接执行自定义Sql ( 这种方式完全不依赖model,前两种还是要依赖于model ) 实例: 使用extra: 1:Book.objects.filter(publisher__name='广东人员出版社').extra(where=['price>50']) Book.objects.filter(publisher__name='广东

查询EBS中LOV的SQL语句

帮助->关于 会话 SID : 507 DECLARE  l_sid NUMBER := :SID;BEGIN  FOR cur_sql IN (SELECT sql_text                    FROM v$sqltext_with_newlines t                   WHERE t.address IN (SELECT s.prev_sql_addr                                         FROM v$ses

Mybatis中如何在SQL语句表名中使用参数

insert into prefix_${table_name} (a, b, c) values (#{a}, #{b}, #{c}) ${} 表示直接使用字面量(literal value) #{} 表示这个是个参数 如果 table_name 是 "ABC" 则 ${table_name} 是 ABC #{table_name} 是 "ABC" Mybatis中如何在SQL语句表名中使用参数,布布扣,bubuko.com

存储过程中执行动态Sql语句

存储过程中执行动态Sql语句 MSSQL为我们提供了两种动态执行SQL语句的命令,分别是EXEC和sp_executesql;通常,sp_executesql则更具有优势,它提供了输入输出接口,而EXEC没有.还有一个最大的好处就是利用sp_executesql,能够重用执行计划,这就大大提供了执行性能,还可以编写更安全的代码.EXEC在某些情况下会更灵活.除非您有令人信服的理由使用EXEC,否侧尽量使用sp_executesql. 1.EXEC的使用 EXEC命令有两种用法,一种是执行一个存储