hibernate预编译SQL语句中的setParameter和setParameterList

使用预编译SQL语句和占位符参数(在jdbc中是?),能够避免因为使用字符串拼接sql语句带来的复杂性。我们先来简单的看下,使用预编译SQL语句的好处。使用String sql = "select * from Student where name=" + name;如果name的值是1或 "aty"或"aty‘aty",就会产生下面错误的sql

--ORA-01722 invalid number
select * from student where name=1;

--ORA-00904 invalid identifier
select * from student where name=aty;

--ORA-01756: quoted string not properly terminated
select * from student where name=aty'aty;

在构造sql的时候,使如果用了字符串拼接,就必须考虑数据类型,是否需要加单引号等细节问题,稍微不注意,就会导致错误sql语句。当拼接字符串很多的时候,代码几乎不可读,定位问题也十分困难。这是预编译sql在代码可读性和简单性上的优势。还有就是性能上的优势,可以参考我的另一篇博文:HQL或SQL使用?带来的好处:减少SQL解析时间、降低内存开销、防止SQL注入

JDBC提供PreparedStatement.setXXX()来替换占位参数,hibernate对应的是setParameter和setParameterList。

setParameter和setParameterList的区别在于,使用in的时候。

Object[] params = new Integer[]{1, 2};

String hqlF = "from Student where id in (?,?)";
Query query = session.createQuery(hqlF);
for (int i = 0; i < params.length; i++)
{
    query.setParameter(i, params[i]);
}

//String hqlS = "from Student where id in :valueList";
String hqlS = "from Student where id in (:valueList)";
Query queryS = session.createQuery(hqlS);
queryS.setParameterList("valueList", params);

很显然,使用setParameterList代码更简单。这里也赞美下hibernate的API设计,既提供了常规繁琐的做法setParameter,也提供了简洁易用的setParameterList。这种一致性,对于熟悉和不熟悉hibernate的人来说,提供了更多的选择。

时间: 2024-10-05 05:07:45

hibernate预编译SQL语句中的setParameter和setParameterList的相关文章

java预编译SQL和参数替换 更新&#183;&#183;&#183;&#183;PSF

原文:java预编译SQL和参数替换 更新····PSF 源代码下载地址:http://www.zuidaima.com/share/1550463668718592.htm 功能为将项目中输出的预编译SQL语句,转换为带实际参数的SQL语句. 代码为javaSwing,启动类为AppStart.java. 界面如下图:

atitit.查看预编译sql问号 本质and原理and查看原生sql语句

atitit.查看预编译sql问号 本质and原理and查看原生sql语句 1. 预编译原理. 1 2. preparedStatement 有三大优点: 1 3. How to look  gene  sql 2 1. Hb cfg all debug ,cant see... 2 2. WSExplorer按照进程抓取pack可以看见.. 2 3. Mysql 5.6 开放日志可以看见 2 4. Mysql and msssql的不同实现 2 4. MYSql的实现是jdbc连接完全的sql

JDBC编程之预编译SQL与防注入式攻击以及PreparedStatement的使用教程

在JDBC编程中,常用Statement.PreparedStatement 和 CallableStatement三种方式来执行查询语句,其中 Statement 用于通用查询, PreparedStatement 用于执行参数化查询,而 CallableStatement则是用于存储过程. 1.Statement       该对象用于执行静态的 SQL 语句,并且返回执行结果. 此处的SQL语句必须是完整的,有明确的数据指示.查的是哪条记录?改的是哪条记录?都要指示清楚.     通过调用

【JDBC】预编译SQL与防注入式攻击

在JDBC编程中,常用Statement.PreparedStatement 和 CallableStatement三种方式来执行查询语句,其中 Statement 用于通用查询, PreparedStatement 用于执行参数化查询,而 CallableStatement则是用于存储过程. 1.Statement       该对象用于执行静态的 SQL 语句,并且返回执行结果. 此处的SQL语句必须是完整的,有明确的数据指示.查的是哪条记录?改的是哪条记录?都要指示清楚.     通过调用

Hibernate直接执行SQL语句

又到周六时间了.我有一次帮公安局开发项目时,有这么一个需求,在做统计报表的时候,我在Oralce数据中创建了一个视图,按管辖单位进行了分组,计算了每个管辖单位涉案人数及接警人数等,数据库视图倒是出来了,但是前台需求一个时间查询,也就是客户可以按时间检索,可是视图中,只能加上固定的时间进行where查询,但不能把时间字段加进去,一旦把时间字段加进去的话,就变成了按时间分组,原本管辖单位是六十来个,按时间分组就变成了上千上万条信息,这是不合要求的,这样根本无法统计出每个管辖单位的数据,因为数据库大,

SQL语句中的乘号

在ADO中,我们需要在SQL语句中使用乘法运算,可是添加'*'以后执行程序总是会出错,这是因为‘*’与sql中的‘*’关键字重合了,所以编译会出错. 解决办法:将乘法运算放到sql语句外面,将结果放入一个变量中,然后在sql语句中引用即可 int count = (this.AspNetPager1.CurrentPageIndex-1)*this.AspNetPager1.PageSize; string sql = " select top "+count+" E_Id

回顾sql语句中的各种连接

1. 内连接(Inner Join) 内连接是最常见的一种连接,它页被称为普通连接,而E.FCodd最早称之为自然连接. 下面是ANSI SQL-92标准 select * from    t_institution i inner join t_teller t on i.inst_no = t.inst_no where i.inst_no = "5801" 其中inner可以省略. 等价于早期的连接语法 select * from t_institution i, t_telle

oracle sql语句中使用if逻辑

l在 SQL 语句中使用IF-THEN-ELSE 逻辑 l l使用两种方法: •CASE 表达式:SQL99的语法,类似Basic,比较繁琐 •DECODE 函数:Oracle自己的语法,类似Java,比较简介 1 SQL> select ename,job, sal, case job when 'PRESIDENT' then 1.1*sal 2 2 when 'MANAGER' then 1.2*sal 3 3 when 'CLERK' then 1.3*sal 4 4 else 1.4*

SQL语句中DateAdd 函数说明

实践例子: 将借阅表中所有记录的归还日期加15天: 执行前情况: 执行后情况如下: update 借阅 set 归还日期=DateAdd ("D",15,归还日期) [详细讲解:] 返回 返回包含一个日期的 Variant (Date),这一日期还加上了一段时间间隔. 语法 DateAdd(interval, number, date) DateAdd 函数语法中有下列命名参数: interval 必要.字符串表达式,是所要加上去的时间间隔. number 必要.数值表达式,是要加上的