这几天一直在做quartz调度的开发,在做数据查询时经常用到对date类型字段的过滤,SQL(HQL)的拼接一直是头疼的问题,这里做个总结,只有记录才有进步。
SQL(HQL)的拼接在日常的使用中无非就那么两种方式,一种是使用字符串拼接,还有一种是使用查询参数。在这里强烈建议使用参数的方式来拼接SQL语句,防止SQL注入的安全问题,虽然最安全的方式是“不把任何没有经过验证的数据传入服务端”但是在实际的开发中真正能做到的又有多少呢。好了,全是废话,开始正题。
对于date类型字段的过滤要保证一点:拼接完成的SQL中传入或拼接上的值在SQL执行时必须是sql.Date类型的。
方式一:使用字符串拼接。
字符串拼接最后生成的只能是字符串,所以可以使用TO_DATE函数,将函数名接入SQL语句中,让SQL在执行时把字符串转换成java.sql.Date。
java.sql.Date startDate = new java.sql.Date(1000000000);
java.sql.Date endDate = new java.sql.Date(1100000000);
StringBuffer sbuf = new StringBuffer();
sbuf.append("from XXEntity t where t.time >= TO_DATE('")
.append(startDate)
.append("' , 'yyyy-mm-dd') and t.time <= TO_DATE('")
.append(endDate)
.append("' , 'yyyy-mm-dd')");
String sql = sbuf.toString();
System.out.println(sql);
最终打印的语句是:
from XXEntity t where t.time >= TO_DATE('1970-01-12' , 'yyyy-mm-dd') and t.time <= TO_DATE('1970-01-14' , 'yyyy-mm-dd')
从这条打印结果也不难发现:java.sql.Date 的toString()方法得到的时间字符串只有yyyy-mm-dd这种形式。所以如果你要操作代有时分秒的数据请用 timestamp类型存储,这时你要用SimpleDateFormat这个类做时间 格式的转换。这里只讨论date类型的数据。
看下面一段代码:
java.util.Date startDate1 = new java.util.Date();
java.util.Date endDate1 = new java.util.Date();
StringBuffer sbuf1 = new StringBuffer();
sbuf1.append("from XXEntity t where t.time >= TO_DATE('")
.append(startDate1)
.append("' , 'yyyy-mm-dd') and t.time <= TO_DATE('")
.append(endDate1)
.append("' , 'yyyy-mm-dd')");
String sql1 = sbuf1.toString();
System.out.println(sql1);
打印的结果如下:
from XXEntity t where t.time >= TO_DATE('Fri Aug 03 20:16:56 CST 2012' , 'yyyy-mm-dd') and t.time <= TO_DATE('Fri Aug 03 20:16:56 CST 2012' , 'yyyy-mm-dd')
这sql是没法执行的。所以在做sql拼接的时候要么使用java.sql.Date,要么使用SimpleDateFormat类做格式化处理,不然拼接的语句是不能执行的。
方式二:使用参数。
使用参数的方式传入变量的值是博主力推的方式,安全,灵活。
1.直接传入java.sql.Date类型的值:
java.sql.Date startDate = new java.sql.Date(1000000000);
java.sql.Date endDate = new java.sql.Date(1100000000);
String sqlString = "from XXEntity t where t.time >= :startTime and t.time <= :endTime";
Query query = session.createQuery(sqlString);
query.setParameter("startTime", startDate).setParameter("endTime", endDate);
query.list();
注意这里面startDate和endDate是做为java.sql.Date类型处理的,因为t.time是一个date类型,所以只能和date类 型的数据进行>=等运算。
2.使用字符串做为参数:
java.sql.Date startDate = new java.sql.Date(1000000000);
java.sql.Date endDate = new java.sql.Date(1100000000);
String sqlString = "from XXEntity t where t.time >= to_date(:startTime,'yyyy-mm-dd') and t.time <= (:endTime , 'yyyy-mm-dd') ";
Query query = session.createQuery(sqlString.toString());
query.setParameter("startTime", startDate).setParameter("endTime", endDate.toString());
query.list();
这里startTime和endTime都必须是字符串类型的。所以做设置参数的时候要把startDate和endDate做类型转换。
这里还有一个值得注意的地方: to_date(:startTime,'yyyy-mm-dd')一定不能写成 to_date(':startTime' , 'yyyy- mm-dd')。不然会出现找不到name为startTime的参数的错误。这个问题的原因是在使用参数 的时候,jdbc会根据 你传入值 的类型拼接sql语句,startTime最后的值一定会是 'yyyy-mm-dd'的形式,不会是yyyy-dd-mm的。
另外:发现有些博客中提到如果使用between的方式查询,在startTime和endTime相等的情况下是无法查出数据 的,小弟没有测试,有兴趣的可以亲测一下。
第一次写技术博客,以后会不断记下自己学习过程的点点滴滴,这里有些需要完善的地方希望前辈们能够给我多 些提点。
分享到:
相关推荐
### HQL语句详解 #### 一、HQL简介 HQL(Hibernate Query Language)是Hibernate框架中的查询语言,它提供了面向对象的方式来进行数据库查询。HQL语法接近于SQL但又有所不同,它允许开发者以面向对象的方式来表达...
以下将详细介绍HQL语句的几个关键部分: 1. **from 子句**:这是HQL查询的起点,用于指定要查询的持久化类。例如,`from Person as p`表示从`Person`类中选择所有实例。`as p`是别名,方便后续引用。 2. **select ...
JPA(Java Persistence API)是一种JavaEE标准,用于持久化数据,HQL(Hibernate Query Language)是 Hibernate 框架提供的一种查询语言,它允许开发者使用面向对象的方式查询数据库。HQL 查询是 JPA 中的一种查询...
在大数据处理领域,Hive是一个基于Hadoop的数据仓库工具,它允许用户使用SQL(HQL,Hive Query Language)查询和管理存储在Hadoop文件系统(HDFS)中的大规模数据集。Hive元数据是Hive操作的核心部分,它包含了...
以下是对HQL语句的详细解释: 1. **选择语句**: - `from Person`:这表示从`Person`类中选取所有实例。这里的`Person`是持久化类,代表了数据库中的一个表。 - `as`关键字用于为查询结果的实体创建别名,如`from...
HQL(Hibernate Query Language)是一种面向对象的查询语言,它允许开发者使用类及其属性来编写查询语句,而不是传统的SQL语句。这使得开发人员可以更加专注于业务逻辑而非底层数据库的细节。 **1.1 基本查询** - *...
2. **Native SQL 查询**:当需要执行特定于某种数据库的 SQL 语句时,可以使用 Native SQL 查询。 3. **数据过滤**:Hibernate 提供了数据过滤功能,可以在不修改实体类的情况下动态地改变查询结果。 #### 六、...
例如,可以使用`CREATE TABLE`语句创建表,`LOAD DATA`语句导入数据,`SELECT`语句进行查询,`JOIN`语句处理多表关联,`WHERE`子句过滤数据,`GROUP BY`和`HAVING`用于分组和条件筛选,以及`ORDER BY`和`DISTRIBUTE ...
HQL(Hibernate Query Language)是一种专为Hibernate设计的面向对象的查询语言,它允许开发者使用类名和属性名来进行数据库查询,而无需直接操作SQL语句。这不仅提高了代码的可读性和可维护性,还使得开发工作更加...
假设这个文件包含用户ID(userId),视频ID(videoId),观看时间(watchTime)和日期(date)等字段,创建表的HQL语句可能如下: ```sql CREATE TABLE IF NOT EXISTS video_views ( userId INT, videoId INT, ...
**Hive实战:统计各种TOP的...通过本项目的实践,我们可以掌握如何使用Hive进行数据导入、创建表、编写HQL语句以及执行各种统计任务,从而提升大数据分析的能力。在实际工作中,这样的技能对于理解和优化业务至关重要。
本实战项目中的源码可能包括了这些HQL语句,以及可能需要的额外脚本或配置文件。提供的jar包可能是为了支持某些自定义函数或者特定的数据格式解析。在实际操作时,需要确保Hive环境已经正确配置,且Hadoop集群运行...
它提供了一个SQL-like的查询语言,称为HQL(Hive Query Language),使得用户可以使用类似SQL的语句来查询和管理数据。在Hive开发中,遵循一定的规范和要点非常重要,以下是Hive开发规范及要点: 一、基本操作 1. ...
HQL(Hibernate Query Language)是一种面向对象的查询语言,它允许开发者用类和属性名称来查询数据库,而不需要直接编写SQL语句。这大大简化了数据库操作的过程,并使得代码更加清晰易读。在本文中,我们将详细介绍...
在IT行业中,Hive是一个基于Hadoop的数据仓库工具,它允许用户使用SQL(HQL,Hive查询语言)对大规模数据集进行分析和处理。Hive文件读写是Hive核心功能之一,使得数据分析师和数据科学家能够方便地对存储在HDFS...
SQL查询是一种使用Hibernate的Session对象直接执行SQL语句的方式。示例代码: ```java static void query(String name){ Session s=null; try{ s=HibernateUtil.getSession(); String sql="select * from admin ...
这意味着用户可以自由选择数据的存储格式和组织方式,只需要在创建表时指定列分隔符和行分隔符即可。 Hive支持以下几种主要的数据模型: 1. **表(Table)**:类似于传统关系型数据库中的表,用于存储结构化数据。...
HQL,全称为Hibernate Query Language,是Hibernate提供的一种查询语言,它类似于SQL但更接近于面向对象的方式。HQL支持多种查询方式,能够进行复杂的数据检索和操作。 ##### HQL与SQL的区别 - **面向对象性**:...