`
zhongguoren
  • 浏览: 7513 次
  • 来自: 地球
最近访客 更多访客>>
社区版块
存档分类
最新评论

关于Hibernate的HQL语句的占位符的一个问题

阅读更多
作者 together
--------------------------------------------------------------------------------


xiaoyuonline 写道
引用
关于Hibernate的HQL语句的占位符的一个问题

首先我的环境是Hibernate + oracle9i

代码如下:
String hql = "select user.name from User user where user.name='hello'";
Query query = session.createQuery(hql);
List list = query.list();
if(list.isEmpty())
{ System.out.println(false);
} esle
{ System.out.println(true);
}

打印出来是true
但如果改写上面的代码如下:
String hql = "select user.name from User user where user.name=:name";
Query query = session.createQuery(hql);
query.setParameter("name","hello");
List list = query.list();
if(list.isEmpty())
{ System.out.println(false);
} esle
{ System.out.println(true);
} 打印出来就是fasle
改写query.setParameter("name","'hello'");
打印出来还是false
请问我哪个地方出错了吗?


经过我的测试,作者所说的问题确实存在。
但当数据库采用sql server或者mysql5时,采用char类型,没有任何问题。
所以判断该错误与hibernate本身没有关系。而与oracle的jdbc驱动有关。
试了classes12.jar和ojdbc.jar,也试过了oci驱动,均错误依旧。

我建了一个表:create table test(name char(7));内有N条值为hello的记录
第一种:不用占位符,
java.sql.PreparedStatement ps = connection().prepareStatement("select * from test where name='hello'");
java.sql.ResultSet rs = ps.executeQuery();
记录集rs有数据;

第二种:使用占位符,
java.sql.PreparedStatement ps = connection().prepareStatement("select * from test where name=?");
ps.setString(1,"hello");
java.sql.ResultSet rs = ps.executeQuery();
记录集rs中无任何数据。

字段改为varchar时,以上语句均无任何问题。因此,不要再费劲了,至于产生此问题的详细原因及解决办法,我暂时还没想到。oracle的第三方驱动很少,datadirect还是收费的。

笨一点的解决办法,就不要再采用char类型了,想不通为什么非要用此类型不可。直接转换为varchar类型好了,绝对的正常。


分享到:
评论
2 楼 xy_z487 2008-09-02  
哈哈,oracle 的char 定义为 char(7),存放了hello 占6个字节/或占6个字符(看你的7是char类型还是byte类型),先不管这个。没用完的一个被存为空格,

‘name ’是 不等于
‘name’ 的,
你试一下like,就可以查出来了, 正确用法,rtrim(name) = ‘hello’
或者改为varchar2类型。它是变长,没有多追加空格一说 。
1 楼 may_cauc 2007-06-12  
我们的数据库已经设计好了,难道就没有办法了吗?呜呜

相关推荐

    经典hibernate教程-HQL语句

    HQL的全称是?...HQL语句为:select jd.jdid,jd.jd from TblJd jd。怎样获得并显示查询结果? 使用'?'做占位符的参数查询,怎样设置参数的值? 命名参数查询的语法是? 怎样创建Criteria查询对象?

    SQL语句填充占位符

    SQL语句填充占位符是一种编程技术,它允许我们创建一个带有占位符的静态SQL模板,然后在运行时根据实际参数动态地替换这些占位符。这种方法提高了代码的可读性和安全性,减少了手动构造SQL字符串的需求。 在Java中...

    hibernate 中HQL语句查询学习笔记

    这里的`:dept`是一个参数占位符。 ##### 在映射文件配置HQL语句 可以在Hibernate的映射文件中定义HQL查询: ```xml SELECT s FROM Student s WHERE s.sdept = :dept ``` 这样可以直接在代码中引用这些预定义...

    占位符查询

    4. **占位符查询**:在构造SQL或HQL语句时,可以使用参数化查询(即占位符查询),这种方式可以避免SQL注入等问题,并且提高了查询效率。 #### 三、具体示例分析 ##### 示例1:使用HQL进行占位符查询 在给定的...

    Hibernate 课件_HQL

    - **setXXX()**:用于设置HQL中的占位符(`?` 或变量名)的值。 - `setString(int position, String value)`:设置HQL中按位置顺序出现的`?`的值。 - `setString(String paraName, String value)`:设置HQL中通过...

    Hibernate HQL详解.docx

    命名查询将HQL语句写在`.hbm.xml`配置文件中,如`<query name="queryUserRange">`,这提高了代码的可维护性。在Java代码中,可以通过`session.getNamedQuery("queryUserRange")`调用。 理解并熟练运用这些HQL特性...

    hibernate hql各类查询范例

    在第一个示例中,我们看到一个名为 `findPerson` 的方法,该方法执行了一个 HQL 查询来查找满足特定条件的人。这里的 HQL 语句为: ```java "from syidt.modules.grp.basegrp.persistence.Person as person where ...

    hql语句大全

    以下是对标题和描述中所提到的HQL语句的详细说明: 1. 实体查询: HQL的基本查询形式是`from 类名`,这将返回该类的所有实例,包括其子类。例如,`from TUser`将获取所有TUser对象。如果TUser类有外键,不指定特定...

    Hibernate 经常用的一些HQL语句

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

    hql基础语句

    - ** 占位符参数 **:`from EntityName e where e.property = ?1`,然后使用`setParameter`方法设置参数及其值。 - ** 参数名参数 **:`from EntityName e where e.property = :myParam`,然后使用`setParamater`...

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

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

    hql语句 使用大全

    ### HQL语句使用大全 HQL(Hibernate Query Language)是一种面向对象的查询语言,它提供了灵活而强大的数据检索方式,使开发人员能够更高效地与数据库交互。本文将详细介绍HQL的基本用法及高级特性。 #### 1. ...

    Hibernate各种查询:联表查询 分页查询 位置参数查询(?) 占位符查询(冒号查询) 统计查询

    本篇文章将详细解析Hibernate中的几种主要查询方式,包括联表查询、分页查询、位置参数查询、占位符查询(冒号查询)以及统计查询,这些都是在实际开发中非常常见的需求。 首先,我们来看**联表查询**。在Hibernate...

    Hibernate HQL命名参数和Query接口的分页

    `占位符。这种方式的好处在于提高了代码的可读性和可维护性,因为命名参数可以清晰地表示参数的用途。例如: ```java String hql = "FROM User WHERE username = :username AND password = :password"; Query query...

    Hibernate-HQL-查询-Query资料

    - "HQL语句(结合实例).doc"则可能提供了具体的查询示例,帮助读者更好地理解和应用HQL。 通过学习这些文档,开发者可以掌握如何在Hibernate项目中高效地利用HQL进行数据查询,提升开发效率,同时保持代码的简洁...

    hql语句的学习,很有用的东西

    本篇文章将深入探讨HQL语句的学习及其在Hibernate中的应用。 首先,HQL语句的核心特性是它的面向对象性。与SQL不同,HQL直接操作对象和实体,这使得代码更易于理解和维护。例如,如果你想从数据库中获取所有User...

    hibernate所用到HQL经典语句大全

    - `:createDate`是一个占位符,用于接收外部传入的参数。 **2.2 HQL支持的运算符** - **数学运算符**:+、-、*、/ - **比较操作符**:=、!=、<、、>、>=、LIKE - **逻辑运算符**:AND、OR、NOT - **SQL操作符**:IN...

    hibernate hql大全

    `或`:paramName`作为参数占位符,防止SQL注入,例如: ```java String query = "from Employee e where e.name = :name"; Query q = session.createQuery(query); q.setParameter("name", "John"); ``` 以上内容...

    Spring中hql语句的常用方法

    ### Spring框架中HQL语句的使用方法 在学习Spring框架与Hibernate集成的过程中,掌握HQL(Hibernate Query Language)的使用方法是十分重要的。本文档将详细介绍如何在Spring环境中运用HQL进行数据查询操作,包括...

    Hibernate HQL教程

    - **解释**: 使用`:age`作为参数占位符,并通过`setParameter`方法绑定实际值。 ##### 1.2.4 在映射文件配置HQL语句 - **示例**: ```xml <hibernate-mapping> <class name="com.example.hibernate.Student" ...

Global site tag (gtag.js) - Google Analytics