`
bendan123812
  • 浏览: 77107 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

过滤date类型的数据时SQL(HQL)语句创建的几种方式

阅读更多

 

 这几天一直在做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语句详解 #### 一、HQL简介 HQL(Hibernate Query Language)是Hibernate框架中的查询语言,它提供了面向对象的方式来进行数据库查询。HQL语法接近于SQL但又有所不同,它允许开发者以面向对象的方式来表达...

    HQL语句的语法

    以下将详细介绍HQL语句的几个关键部分: 1. **from 子句**:这是HQL查询的起点,用于指定要查询的持久化类。例如,`from Person as p`表示从`Person`类中选择所有实例。`as p`是别名,方便后续引用。 2. **select ...

    JPA--HQL查询(手动写原生查询sql,复杂查询必备).pdf

    JPA(Java Persistence API)是一种JavaEE标准,用于持久化数据,HQL(Hibernate Query Language)是 Hibernate 框架提供的一种查询语言,它允许开发者使用面向对象的方式查询数据库。HQL 查询是 JPA 中的一种查询...

    hive元数据生成建表语句

    在大数据处理领域,Hive是一个基于Hadoop的数据仓库工具,它允许用户使用SQL(HQL,Hive Query Language)查询和管理存储在Hadoop文件系统(HDFS)中的大规模数据集。Hive元数据是Hive操作的核心部分,它包含了...

    HQL 语句 帮助 还行

    以下是对HQL语句的详细解释: 1. **选择语句**: - `from Person`:这表示从`Person`类中选取所有实例。这里的`Person`是持久化类,代表了数据库中的一个表。 - `as`关键字用于为查询结果的实体创建别名,如`from...

    hibernate所用到HQL经典语句大全

    HQL(Hibernate Query Language)是一种面向对象的查询语言,它允许开发者使用类及其属性来编写查询语句,而不是传统的SQL语句。这使得开发人员可以更加专注于业务逻辑而非底层数据库的细节。 **1.1 基本查询** - *...

    Hadoop-2.8.0-Day08-Hive函数与HQL详解-课件与资料.zip

    例如,可以使用`CREATE TABLE`语句创建表,`LOAD DATA`语句导入数据,`SELECT`语句进行查询,`JOIN`语句处理多表关联,`WHERE`子句过滤数据,`GROUP BY`和`HAVING`用于分组和条件筛选,以及`ORDER BY`和`DISTRIBUTE ...

    hql查询语言语法

    HQL(Hibernate Query Language)是一种专为Hibernate设计的面向对象的查询语言,它允许开发者使用类名和属性名来进行数据库查询,而无需直接操作SQL语句。这不仅提高了代码的可读性和可维护性,还使得开发工作更加...

    Hive实战之视频网站的测试数据

    假设这个文件包含用户ID(userId),视频ID(videoId),观看时间(watchTime)和日期(date)等字段,创建表的HQL语句可能如下: ```sql CREATE TABLE IF NOT EXISTS video_views ( userId INT, videoId INT, ...

    Hive练习项目统计各种TOP的实战(数据和代码)

    **Hive实战:统计各种TOP的...通过本项目的实践,我们可以掌握如何使用Hive进行数据导入、创建表、编写HQL语句以及执行各种统计任务,从而提升大数据分析的能力。在实际工作中,这样的技能对于理解和优化业务至关重要。

    大数据小型实战项目源码之Hive 通过日期计算星座实例

    本实战项目中的源码可能包括了这些HQL语句,以及可能需要的额外脚本或配置文件。提供的jar包可能是为了支持某些自定义函数或者特定的数据格式解析。在实际操作时,需要确保Hive环境已经正确配置,且Hadoop集群运行...

    Hive开发规范及要点

    它提供了一个SQL-like的查询语言,称为HQL(Hive Query Language),使得用户可以使用类似SQL的语句来查询和管理数据。在Hive开发中,遵循一定的规范和要点非常重要,以下是Hive开发规范及要点: 一、基本操作 1. ...

    HQL常用函数

    HQL(Hibernate Query Language)是一种面向对象的查询语言,它允许开发者用类和属性名称来查询数据库,而不需要直接编写SQL语句。这大大简化了数据库操作的过程,并使得代码更加清晰易读。在本文中,我们将详细介绍...

    HIVE文件读写

    在IT行业中,Hive是一个基于Hadoop的数据仓库工具,它允许用户使用SQL(HQL,Hive查询语言)对大规模数据集进行分析和处理。Hive文件读写是Hive核心功能之一,使得数据分析师和数据科学家能够方便地对存储在HDFS...

    六种方式实现hibernate查询

    SQL查询是一种使用Hibernate的Session对象直接执行SQL语句的方式。示例代码: ```java static void query(String name){ Session s=null; try{ s=HibernateUtil.getSession(); String sql="select * from admin ...

    Hive操作指南

    这意味着用户可以自由选择数据的存储格式和组织方式,只需要在创建表时指定列分隔符和行分隔符即可。 Hive支持以下几种主要的数据模型: 1. **表(Table)**:类似于传统关系型数据库中的表,用于存储结构化数据。...

    Hibernate技术详解

    HQL,全称为Hibernate Query Language,是Hibernate提供的一种查询语言,它类似于SQL但更接近于面向对象的方式。HQL支持多种查询方式,能够进行复杂的数据检索和操作。 ##### HQL与SQL的区别 - **面向对象性**:...

Global site tag (gtag.js) - Google Analytics