`
lanxia39
  • 浏览: 29864 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
文章分类
社区版块
存档分类
最新评论

HQL语句传入传入日期问题,试验了好几种方式,都不成功,麻烦个位高手看下咯

阅读更多
测试代码如下
1,测试实体类
package com.dtsoft;

import java.util.Date;

/**
* Test generated by MyEclipse Persistence Tools
*/

public class Test implements java.io.Serializable {

// Fields

private Integer id;

private Date dt;

// Constructors

/** default constructor */
public Test() {
}

/** minimal constructor */
public Test(Integer id) {
this.id = id;
}

/** full constructor */
public Test(Integer id, Date dt) {
this.id = id;
this.dt = dt;
}

// Property accessors

public Integer getId() {
return this.id;
}

public void setId(Integer id) {
this.id = id;
}

public Date getDt() {
return this.dt;
}

public void setDt(Date dt) {
this.dt = dt;
}

}
2测试代码
1:第一种方法
package com.dtsoft.test;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

public class Test {

/**
* @param args
*/
public static void main(String[] args) {
Configuration cf = new Configuration().configure();
SessionFactory sf = cf.buildSessionFactory();
Date date = new Date();
Calendar rightNow = Calendar.getInstance();
rightNow.setTime(date);
rightNow.set(Calendar.HOUR_OF_DAY, 00);
rightNow.set(Calendar.MINUTE, 00);
rightNow.set(Calendar.SECOND, 00);
Date date1 = rightNow.getTime();

System.out.println(date);
Session s = sf.openSession();
String hql = "select * from text where dt<'"+date1+"'";
Transaction t = s.getTransaction();
t.begin();
s.createQuery(hql);

t.commit();
s.flush();
s.close();
}
报以下异常:
Mon Feb 07 03:12:40 CST 2000
Exception in thread "main" org.hibernate.hql.ast.QuerySyntaxException: unexpected token: * near line 1, column 8 [select * from text where dt<'Mon Feb 07 00:00:00 CST 2000']
at org.hibernate.hql.ast.ErrorCounter.throwQueryException(ErrorCounter.java:59)
at org.hibernate.hql.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:244)
at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:155)
at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:109)
at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:75)
at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:54)
at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:71)
at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:133)
at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:112)
at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1583)
at com.dtsoft.test.Test.main(Test.java:49)
Caused by: line 1:8: unexpected token: *
at org.hibernate.hql.antlr.HqlBaseParser.selectClause(HqlBaseParser.java:1330)
at org.hibernate.hql.antlr.HqlBaseParser.selectFrom(HqlBaseParser.java:1106)
at org.hibernate.hql.antlr.HqlBaseParser.queryRule(HqlBaseParser.java:702)
at org.hibernate.hql.antlr.HqlBaseParser.selectStatement(HqlBaseParser.java:296)
at org.hibernate.hql.antlr.HqlBaseParser.statement(HqlBaseParser.java:159)
at org.hibernate.hql.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:238)
... 9 more

2:一种方法

public class Test {

/**
* @param args
*/
public static void main(String[] args) {
Configuration cf = new Configuration().configure();
SessionFactory sf = cf.buildSessionFactory();

Calendar rightNow = Calendar.getInstance();
rightNow.setTime(date);
rightNow.set(Calendar.HOUR_OF_DAY, 00);
rightNow.set(Calendar.MINUTE, 00);
rightNow.set(Calendar.SECOND, 00);
Date date1 = rightNow.getTime();

System.out.println(date);
Session s = sf.openSession();
String hql = "select * from text where dt<?";

Transaction t = s.getTransaction();
t.begin();

s.createQuery(hql).setDate(0, date1);

t.commit();
s.flush();
s.close();
}
Exception in thread "main" org.hibernate.hql.ast.QuerySyntaxException: unexpected token: * near line 1, column 8 [select * from text where dt<?]
at org.hibernate.hql.ast.ErrorCounter.throwQueryException(ErrorCounter.java:59)
at org.hibernate.hql.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:244)
at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:155)
at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:109)
at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:75)
at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:54)
at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:71)
at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:133)
at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:112)
at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1583)
at com.dtsoft.test.Test.main(Test.java:49)
Caused by: line 1:8: unexpected token: *
at org.hibernate.hql.antlr.HqlBaseParser.selectClause(HqlBaseParser.java:1330)
at org.hibernate.hql.antlr.HqlBaseParser.selectFrom(HqlBaseParser.java:1106)
at org.hibernate.hql.antlr.HqlBaseParser.queryRule(HqlBaseParser.java:702)
at org.hibernate.hql.antlr.HqlBaseParser.selectStatement(HqlBaseParser.java:296)
at org.hibernate.hql.antlr.HqlBaseParser.statement(HqlBaseParser.java:159)
at org.hibernate.hql.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:238)
... 9 more
分享到:
评论
6 楼 chinamicrofox 2008-04-27  
时间和数据库里的对应,如果数据库内的是'YYYY-MM-DD HH:MI:SS'传入的就应该这样,如果数据库里的只是是YYYY-MM-DD,那么传入的也应该这样。你的HH24我觉得应该HH就好了。比如2008-04-26 14:30:00
5 楼 lanxia39 2008-04-19  
javaeye高手们,知道就说出来了,评东西就来劲,做程序员实在点,能解决就帮忙打几行字吗?别那么吝啬,当评委有么子意思啊,看了帖也不帮忙解决
4 楼 lanxia39 2008-04-19  
魔力猫咪 写道
你只有第二种是唯一最接近正确的写法。你看清异常信息* near line 1, column 8这说明是在第一行第八个字符处出现问题。
你应该的写法是
select text from text where dt < ?
然后setDate
HQL不是SQL,不要乱用。你用的是HQL,不是SQL。这一点要绝对牢记。你操作的是对象不是数据库表。

嘿嘿,粗心,但这样写HQL好像支持吧,还有是公司里把hib全封装了,根本无法调用第2中方法去做,能直接在HQL中传入date吗
3 楼 魔力猫咪 2008-04-19  
你只有第二种是唯一最接近正确的写法。你看清异常信息* near line 1, column 8这说明是在第一行第八个字符处出现问题。
你应该的写法是
select text from text where dt < ?
然后setDate
HQL不是SQL,不要乱用。你用的是HQL,不是SQL。这一点要绝对牢记。你操作的是对象不是数据库表。
2 楼 lanxia39 2008-04-19  
忘了加一句
SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
sd.format(date);
结果也不可以
1 楼 lanxia39 2008-04-19  
3:第三中方法
package com.dtsoft.test;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

public class Test {

/**
* @param args
*/
public static void main(String[] args) {
Configuration cf = new Configuration().configure();
SessionFactory sf = cf.buildSessionFactory();
String time = "2007-08-09 09:06:03";

Calendar rightNow = Calendar.getInstance();
rightNow.setTime(date);
rightNow.set(Calendar.HOUR_OF_DAY, 00);
rightNow.set(Calendar.MINUTE, 00);
rightNow.set(Calendar.SECOND, 00);
Date date1 = rightNow.getTime();

System.out.println(date);
Session s = sf.openSession();
String hql = "select * from text where to_char(dt,'YYYY-MM-DD HH24:MI:SS')<'"+time+"'";

Transaction t = s.getTransaction();
t.begin();

s.createQuery(hql);

t.commit();
s.flush();
s.close();
}

}
Exception in thread "main" org.hibernate.hql.ast.QuerySyntaxException: unexpected token: * near line 1, column 8 [select * from text where to_char(dt,'YYYY-MM-DD HH24:MI:SS')<'2007-08-09 09:06:03']
at org.hibernate.hql.ast.ErrorCounter.throwQueryException(ErrorCounter.java:59)
at org.hibernate.hql.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:244)
at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:155)
at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:109)
at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:75)
at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:54)
at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:71)
at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:133)
at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:112)
at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1583)
at com.dtsoft.test.Test.main(Test.java:49)
Caused by: line 1:8: unexpected token: *
at org.hibernate.hql.antlr.HqlBaseParser.selectClause(HqlBaseParser.java:1330)
at org.hibernate.hql.antlr.HqlBaseParser.selectFrom(HqlBaseParser.java:1106)
at org.hibernate.hql.antlr.HqlBaseParser.queryRule(HqlBaseParser.java:702)
at org.hibernate.hql.antlr.HqlBaseParser.selectStatement(HqlBaseParser.java:296)
at org.hibernate.hql.antlr.HqlBaseParser.statement(HqlBaseParser.java:159)
at org.hibernate.hql.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:238)
... 9 more

相关推荐

    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 ...

    HQL查询及语法

    3. **创建Query对象**:利用Session对象的`createQuery`方法,传入HQL语句创建Query实例。 4. **设置参数**:如果HQL语句中包含参数,需调用Query对象的`setXxx`方法为其赋值。 5. **执行查询并处理结果**:最后...

    Hibernate 经常用的一些HQL语句

    标题:“Hibernate 经常用的一些HQL语句” 描述:“可以让我们更方便的学习Hibernate” ### HQL(Hibernate Query Language)在Hibernate中的应用 HQL是Hibernate框架提供的查询语言,它允许开发者以面向对象的...

    hibernate hql各类查询范例

    根据提供的文件信息,我们可以归纳出以下几个关键的知识点: ### 1. 使用 HQL 进行基本查询 在第一个示例中,我们看到一个名为 `findPerson` 的方法,该方法执行了一个 HQL 查询来查找满足特定条件的人。这里的 ...

    hibernate所用到HQL经典语句大全

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

    HQL语法入门学习HQL语法入门学习

    3. **创建Query对象**: 使用Session的`createQuery`方法,传入HQL查询语句,创建Query对象。 4. **设置参数**: 如果HQL中有参数,可以通过`setXxx`方法(如`setString`, `setDate`等)为参数赋值。 5. **执行查询*...

    HQL进阶语句

    例如,如果我们只需要查询 User 实体的 name 和 age 属性,可以这样写 HQL 语句: ```java String hql = "select user.name, user.age from User user"; List[]&gt; result = session.createQuery(hql).list(); ``` ...

    HQL语言大全 高清晰可复制版

    HQL语句主要包括查询、选择、从、where、group by、having、order by等部分,与SQL非常相似。例如,一个简单的HQL查询可能如下所示: ```sql FROM Employee e WHERE e.name = 'John' ``` 这条语句将返回所有...

    hql总条数.txt

    HQL是一种面向对象的查询语言,它允许开发者以面向对象的方式操作数据库,而无需直接与SQL语句打交道。 ### HQL查询数据库总条数 #### 代码解析 提供的代码段展示了如何使用HQL来获取数据库中特定表或查询结果的...

    hibernate-hql 资料大全

    1. **find(String queryString)**: 这是最基础的HQL查询方法,接受一个HQL语句作为参数,返回所有匹配该查询的实体对象。例如,"from bean.User"会返回所有的User对象。 2. **find(String queryString, Object ...

    Hibernate调用配置文件中的sql语句

    在这里,`{param1}`是一个参数占位符,可以通过Query对象的setParameter方法传入实际值。 3. **执行SQL查询**:在Java代码中,我们可以使用SessionFactory的createSQLQuery方法来获取SQLQuery对象,然后调用其set...

    hql查询语句

    在Java开发领域,尤其是使用Struts、Spring和Hibernate框架构建应用程序时,HQL(Hibernate Query Language)是一种强大的工具,用于处理对象关系映射(ORM)的数据库查询。HQL是面向对象的,允许开发者以类和对象的...

    hibernate的HQL的模糊查询

    综上所述,Hibernate的HQL模糊查询是开发中不可或缺的工具,它提供了一种简单而强大的方式来处理数据库的模糊查询需求。通过理解并熟练掌握这些概念,可以更好地利用Hibernate进行数据操作,提升项目的开发效率和...

    Spring--HQL-chaxun.zip_HQL

    可以在Hibernate配置文件中定义命名查询,将HQL语句与名字关联,提高代码复用性和可读性。 7. **联合查询**: 使用`JOIN`关键字可以实现对象之间的关联查询,包括内连接(INNER JOIN)、外连接(LEFT JOIN、RIGHT...

    hibernateHQL基本查询

    在 Hibernate 中,所有的查询都是通过 `Query` 对象来实现的,可以通过 `Session` 对象的 `createQuery` 方法创建 `Query` 对象,并传入 HQL 语句。 ##### 1. 查询所有对象 以查询所有图书类别为例,HQL 语句如下:...

    hibernate-HQL用例

    HQL语句中的实体类名对应于数据库中的表名,属性对应于列名。这使得代码更加面向对象,易于维护。 2. **基本查询结构** HQL的基本查询结构包括:SELECT,FROM,WHERE,GROUP BY,HAVING,ORDER BY等关键字。例如,...

    HQL语言大全 跳楼分值

    HQL语句通常由以下几个部分组成: - **SELECT**:选择要查询的字段或对象。 - **FROM**:指定查询的实体类。 - **WHERE**:设置查询条件。 - **GROUP BY**:进行分组。 - **HAVING**:设置分组后的过滤条件。 - **...

    利用java注解拼装HQL

    在这个例子中,`@NamedQuery`定义了一个名为“findUsersByName”的查询,其HQL语句用于查找名字匹配给定参数的用户。这种方式提高了代码的可读性和可维护性,因为查询逻辑与实体类紧密相关。 除了`@NamedQuery`,...

    J2EE HQL语法大全

    1. **查询语句结构**:HQL查询语句的基本结构类似于SQL,由`FROM`、`WHERE`、`SELECT`、`GROUP BY`、`ORDER BY`等关键字组成,但使用类名和属性而非表名和列名。 2. **实体与类**:在HQL中,数据库表被映射为Java类...

Global site tag (gtag.js) - Google Analytics