`
chenlb
  • 浏览: 695704 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

oracle jdbc char 字段 PreparedStatement 查询问题

阅读更多

      昨天出了一个奇怪的问题,hibernate通过实体Id(char(10)型)取得数据,session.find("from TableName where id=?","value");取不到数据,但数据库里是有这个条数据。真奇怪,后来用pl/sql看数据库,鼠标点到Id那时,可以看到内容后面还有一些空格,带着期望与质疑把字段里的值自制过来, session.find("from TableName where id=?","value    ");后发现可以。我特别试了下connection.createStatement("select * from table_name where id='value'");则正常取数据,session.find("from TableName where id=?","value");而却找不到数据,然后又试了下
ptmt = connection.prepareStatement(select * from table_name where id=?");
ptmt.setString(1,"year");

这样也不行,以是结论是:jdbc驱动PrepareStatement对char字段类型的查找问题,因为hibernate是用PrepareStatement的,自然,hibernate对char对应的属性条件查找出现找不到的情况,

解决办法是:
1.属性用TRIM函数处理:session.find("from TableName where TRIM(id)=?","value");
2.char改为varchar2类型

今天试了下mysql,它不会这样的情况,所以结论是:Oracle JDBC PreparedStatement的bug(有可能它故意这样)



流浪汗 2007-10-17 22:22 发表评论
分享到:
评论
11 楼 chenlb 2008-10-04  
myy 写道

跟jdbc版本有关,用 ojdbc14.jar (10g版驱动,也可以连到9i库) 应该没问题。



10g 的 ojdbc14.jar(10.2.0.1.0)
10 楼 chenlb 2008-10-04  
armorking 写道

1.属性用TRIM函数处理:session.find("from TableName where TRIM(id)=?","value"); 既然id是PK,这种做法在查询的时候用PK对应的INDEX就不会被使用 可以考虑用以下形式


Sql代码

from TableName where id=RPAD(?, 10, ' ')  from TableName where id=RPAD(?, 10, ' ')
顺便问一下,LZ用的ORACLE驱动的版本是什么版本的


ojdbc14.jar(10.1.0.2.0) 后来出现 ORA-01461: can bind a LONG value only for insert into a LONG column 改用 ojdbc14.jar(10.2.0.1.0)

这篇文章javaeye导不入, 标题太长了.

 
9 楼 myy 2008-09-27  
跟jdbc版本有关,用 ojdbc14.jar (10g版驱动,也可以连到9i库)
应该没问题。
8 楼 liweisex 2008-09-27  
增加一个UserType的类型 在nullSafeGet方法中去掉value的空格,
String value = (String) Hibernate.STRING.nullSafeGet(resultset, as[0]); value=value.trim();
7 楼 chenlb 2008-05-26  
我的做法是,先把ID去空格.
如: 抛出异常的爱 说的
6 楼 armorking 2008-04-18  
1.属性用TRIM函数处理:session.find("from TableName where TRIM(id)=?","value");

既然id是PK,这种做法在查询的时候用PK对应的INDEX就不会被使用
可以考虑用以下形式
from TableName where id=RPAD(?, 10, ' ')



顺便问一下,LZ用的ORACLE驱动的版本是什么版本的
5 楼 yangbb 2008-04-18  
http://forums.oracle.com/forums/thread.jspa;jsessionid=8d92200630de527b2f61c7ef4d3296318c855aa88fe1.e34Tb34Lb34PbO0Lb3eTahiPbNyTe0?messageID=504702

找到了一个相关的
4 楼 yangbb 2008-04-18  
昨天晚上也遇到类似的问题了。

table_name中的column_name是char(XX)。
采用PrepareStatement,"select * from table_name where column_name=?",然后pstmt.setString(1,value),,就查询不到记录。

但是"select * from table_name where column_name='"+value+"'",就没有问题。

如果把column_name改成varchar2就不存在问题。。。

oracle在预编译的时候是不是会对char类型的字段做处理?
比如select * from table_name where column_name=rpad(value,XX,' ')。
XX是根据column_name定义的char的长度
----这只是我的瞎猜测。。。网上没找到对这个的相关解释
3 楼 抛出异常的爱 2007-10-22  
汗。。。ID中有空格。。。。
你的设计上没有什么问题么,这么作不是办法。。。
还是想办法把id中的空格都删了吧。
2 楼 chenlb 2007-10-19  
我没有报告吧,只是说下开发出现的问题.
1 楼 movingboy 2007-10-18  
楼主你很有勇气啊,这样就报告了一条bug

相关推荐

    解决mybatis使用char类型字段查询oracle数据库时结果返回null问题

    "解决mybatis使用char类型字段查询oracle数据库时结果返回null问题" 在使用mybatis框架对Oracle数据库进行查询操作时,如果使用char类型字段作为查询条件,可能会出现结果返回null的问题。这种情况下,需要对char...

    Oracle函数_JDBC常用写法

    在`oracle日期函数集锦.txt`中,我们可能会看到更多关于日期处理的函数,比如`EXTRACT`用于提取日期或时间字段,`NEXT_DAY`找到下一个特定星期的日期,`LAST_DAY`返回给定日期所在月份的最后一天。 接着,`JDBC常用...

    JDBC 书籍 学习

    在编写查询时,尽量避免查询不必要的字段;同时还需要注意合理设置 fetchSize 的值,Oracle 建议该值不超过 100。 #### 四、批量更新与内存消耗 除了查询缓存之外,批量更新操作也会导致大量内存消耗。每次调用 `...

    Java jdbc 范例

    Java JDBC(Java Database Connectivity)是Java语言中用来规范应用程序如何访问数据库的应用程序接口,它提供了标准的方法来连接、查询和操作数据库系统。在本案例中,我们将通过Java JDBC连接Oracle数据库,实现对...

    JDBC连接实现简单学生管理系统(附数据库).zip

    要使用JDBC,首先需要在程序中加载数据库驱动,然后建立数据库连接,创建Statement或PreparedStatement对象,编写SQL语句,最后执行查询并处理结果。 2. **数据库连接** 在这个系统中,可能使用了诸如MySQL、...

    Java与数据库JDBC.ppt

    JDBC是Java平台标准的一部分,它提供了一套接口和类,使得Java应用程序能够连接到各种类型的数据库,包括Oracle、MySQL、SQL Server等。在Java程序中,我们可以使用JDBC进行数据的增删改查操作。 首先,创建数据库...

    CreateTable.rar_Table

    Oracle JDBC驱动程序允许Java应用程序与Oracle数据库进行交互,包括创建、查询、更新和删除数据。 首先,我们需要导入必要的JDBC库,如`java.sql.Connection`、`java.sql.DriverManager`、`java.sql.Statement`等。...

    专题资料(2021-2022年)JDBC讲课流程.doc

    JDBC API主要包括几个核心接口和类,如`Connection`代表数据库连接,`Statement`用于执行SQL语句,`PreparedStatement`预编译SQL以提高性能,以及`ResultSet`用于存储查询结果。此外,`DriverManager`类负责管理所有...

    ORACLE表自动按月分区步骤

    在Oracle数据库中,为了优化大型数据表的查询性能和管理效率,可以采用分区技术。分区是一种将大表逻辑上划分为较小、更易管理的部分的方法。对于时间序列数据,如交易记录、日志数据等,按月分区尤其常见,因为这...

    MySQL安装和使用

    - **表结构和字段类型**:Oracle使用了诸如NUMBER、VARCHAR2、CHAR、DATE等字段类型,而MySQL的字段类型包括int、long、double、float、varchar、char等。 - **表引擎**:MySQL的表可以采用不同的存储引擎,如...

    oracle+jsp实现分页

    private static final String driver = "oracle.jdbc.driver.OracleDriver"; private static final String url = "jdbc:oracle:thin:@10.10.10.2:1521:orcl"; private static final String username = "test"; ...

    clob增加、修改

    根据给定文件的信息,本文将深入探讨如何在Java中操作Oracle数据库中的CLOB字段,包括添加和修改等操作。CLOB(Character Large Object)是一种用于存储大量文本数据的数据类型,在处理如文章、评论等长文本时非常...

    java存取oracle中的COLB类型数据.pdf

    conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:ORCL", "username", "password"); // 创建 Statement 对象 Statement stmt = conn.createStatement(); // 创建含 CLOB 字段的表 stmt...

    java登陆系统——用oracle数据库实现.docx

    根据提供的文件信息,我们可以推断出这是一份关于使用Java编程语言开发登录系统的文档,其中涉及到Oracle数据库的应用。下面将对这份文档所涉及的关键知识点进行详细的解析与扩展。 ### Java登录系统开发概述 ####...

    create-table.rar_JAVA create tab_Table

    在Java编程语言中,我们可以利用JDBC(Java Database Connectivity)API来与各种关系型数据库进行交互,包括Oracle数据库。在给定的“create-table.rar”压缩包中,我们看到一个名为“c16_1.java”的文件,这很可能...

    java 连接数据库实现用户登录功能

    Oracle数据库提供了对应的JDBC驱动,名为ojdbc.jar。在项目中,你需要将这个驱动添加到类路径中,以便Java程序能够识别并连接到Oracle数据库。 接下来,我们编写Java代码来建立数据库连接。使用`Class.forName()`...

    DateBase_java_

    在“DateBase_java_”项目中,开发者可能使用了JDBC来连接到一个数据库,比如MySQL、Oracle或SQLite等。 3. **数据库设计**:在创建数据库时,需要考虑数据模型,如关系型数据模型。这涉及到创建表(tables)、定义...

    Java开发工程师面试题资料

    2. **SQL优化**:通过编写更高效的查询语句,例如避免子查询、使用连接(JOIN)代替子查询、利用索引、避免全表扫描、减少SELECT字段数量,以及使用EXPLAIN分析查询执行计划来识别性能瓶颈。 3. **事务**:事务是...

Global site tag (gtag.js) - Google Analytics