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

一个无奈的Hibernate问题

阅读更多
背景:
1.数据库使用Oracle,表字段 ColA 被定义为 char(10)(字段类型不能修改,这个是接口方定的)
2.hibernate使用NativeSQL查询(由于项目种种原因,不能使用标准Hibernate的OO方式)。

问题:
从list中返回了List<Object[]>对象,but每行的Object[]中, ColA被Hibernate转成了Character对象,只有一位,后面的char都被截断了.
查了hibernate的文档,知道可以设定每个字段的转化类型,but我们的sql是动态配置的,并不能确定某个字段一定是那种类型,因此此方法不能用了。

暂时的方案:
退回jdbc时代,直接读取DB的META,然后在读数据。


这里的疑问是,为啥Hibernate对Char字段的映射只能是1位嘛,觉得这个转换有问题!!

大家说说,又或者是本人太菜,学艺不精

分享到:
评论
23 楼 zwq4166506 2009-09-21  
不是hibernate的问题,而是Java的char只能是一位。。
应该在hql中cast(ColA as varcher2(10)).
请问LZ,hibernate如何做到动态配置映射?
22 楼 guazi 2009-09-21  
呵呵,我也遇到过,可以在查询的时候给这个字段加一个trim来解决一下,得到的就是string的类型了,而且是完整的,据说是oraclejdbc的一个bug。

原:select char(10) from table ...
改:select trim(char(10)) from table....

你试试。。。。
21 楼 linliangyi2007 2009-09-20  
lgdlgd 写道
这个问题我遇到过,确实都是CharacterType这个类惹的祸,初步看到,HIBERNATE从JDBC取得数据库字段类型,判断如果是CHAR(具体代码好像是12,记不得了),就使用以上的那个类CharacterType来处理,然后这个类直接取第一位,也不管数据库是CHAR(1) 还是CHAR(n),我觉得这是明显有问题的,不知道是不是有什么特殊的原因,不过我使用处理String类型的那个类替换了这个类,到现在快一年了,没发现有什么不妥。



感谢,需要的就是这样专业的回复。
20 楼 zuiyanwangyue 2009-09-20  
lgdlgd 写道
这个问题我遇到过,确实都是CharacterType这个类惹的祸,初步看到,HIBERNATE从JDBC取得数据库字段类型,判断如果是CHAR(具体代码好像是12,记不得了),就使用以上的那个类CharacterType来处理,然后这个类直接取第一位,也不管数据库是CHAR(1) 还是CHAR(n),我觉得这是明显有问题的,不知道是不是有什么特殊的原因,不过我使用处理String类型的那个类替换了这个类,到现在快一年了,没发现有什么不妥。
支持lgdlgd的观点
19 楼 zuiyanwangyue 2009-09-20  
支持lgdlgd的观点
18 楼 lgdlgd 2009-09-20  
这个问题我遇到过,确实都是CharacterType这个类惹的祸,初步看到,HIBERNATE从JDBC取得数据库字段类型,判断如果是CHAR(具体代码好像是12,记不得了),就使用以上的那个类CharacterType来处理,然后这个类直接取第一位,也不管数据库是CHAR(1) 还是CHAR(n),我觉得这是明显有问题的,不知道是不是有什么特殊的原因,不过我使用处理String类型的那个类替换了这个类,到现在快一年了,没发现有什么不妥。
17 楼 zozoh 2009-09-19  
linliangyi2007 写道
魔力猫咪 写道
为什么呢?大不了新建一个专门的纯JDBC数据库连接就是了。你们使用了SQL,而且从这种使用上来看,也没什么缓存的问题。那么干脆就直接另建一个数据库连接好了。最多对这个连接进行限制,让其只能查询。
要不把其他持久化框架引进来。除非Hibernate使用了2级缓存,而你们的处理又会造成数据库数据变动。才不能不必须走Hibernate这条路。


额~~~你说的也对,不过那样又是一个连接池了。
实际上,我的问题不是用不用hibernate啊,而是有没有在Hibernate nativeSQL 执行中对char(n)的正确读取方法?


你可以采用 Nutz 来做:

DataSource ds = null; // get your datasource here.
Dao dao = new NutDao(ds);
Sql sql = Sqls.create("YOUR SQL HERE").setCallback(new SqlCallback() {
	public Object invoke(Connection conn, ResultSet rs, Sql sql) throws SQLException {
		List<Object[]> re = new LinkedList<Object[]>();
		while (rs.next()) {
			// Write you code here
		}
		return re;
	}
});
dao.execute(sql);
// Get the query result
List<Object[]> list = sql.getList(Object[].class);
// ...
for (Object[] objs : list) {
	// write anything as you want
}
16 楼 seele 2009-09-19  
java 中的 char 本来就是一位的....

Oracle 中的char() 可以用来存数组形式的string ...

映射过来应该是string 才是啊...
15 楼 digyso 2009-09-19  
好像碰到过 用cast 不确定是不是一个问题
14 楼 蔡华江 2009-09-19  
使用Transformers将结果直接转化为Map
13 楼 daniel.ho 2009-09-19  
貌似碰到过,一个方法是你在sql里面cast(ColA as char(n));第二个方法,要是多次用到的话,看看直接修改Hibernate的类了,反正也提供了源代码
12 楼 Terence.Gao 2009-09-19  
非常讨厌你这种表达方式,除非关键术语如hibernate直接用英文,个人观点。
别说这么多年就学到了一个but...

badqiu的方法确实经常用到。
11 楼 linliangyi2007 2009-09-18  
whaosoft 写道
你在配置文件里配置成string的试试


木有配置文件,如果有就不是NativeSQL执行方式了,呵呵。
10 楼 whaosoft 2009-09-18  
你在配置文件里配置成string的试试
9 楼 linliangyi2007 2009-09-18  
erotica 写道

SQLQuery query = session.createSQLQuery();
query.addScalar("列名", Hibernate.String)


知道这个方法,但问题是SQL是配置的,列名类型不确定,所以。。。无奈!!

谢谢大家了。估计要改Hibernate的源码才能解决了。
8 楼 erotica 2009-09-18  

SQLQuery query = session.createSQLQuery();
query.addScalar("列名", Hibernate.String)
7 楼 linliangyi2007 2009-09-18  
badqiu 写道
变通的解决办法,使用一个代理方法不就行了.hibernate不直接操作ColA名称,而操作ColaString.而getColA()则适应你的接口

private String colAString;
char[] getColA() {
   return str.toCharArray();
}
public getColAString() {
   return colAString;
}
public setColAString(String v) {
   colAString = v;
}


个人在hibernate很少用到char,所以不清楚.



你这个是在Bean中实现的方法吧。我这边用不上,nativeSQL执行的时候,没有Bean可言的,否则直接将bean的colA映射成String就OK了
6 楼 badqiu 2009-09-18  
变通的解决办法,使用一个代理方法不就行了.hibernate不直接操作ColA名称,而操作ColaString.而getColA()则适应你的接口

private String colAString;
char[] getColA() {
   return str.toCharArray();
}
public getColAString() {
   return colAString;
}
public setColAString(String v) {
   colAString = v;
}


个人在hibernate很少用到char,所以不清楚.
5 楼 linliangyi2007 2009-09-18  
魔力猫咪 写道
为什么呢?大不了新建一个专门的纯JDBC数据库连接就是了。你们使用了SQL,而且从这种使用上来看,也没什么缓存的问题。那么干脆就直接另建一个数据库连接好了。最多对这个连接进行限制,让其只能查询。
要不把其他持久化框架引进来。除非Hibernate使用了2级缓存,而你们的处理又会造成数据库数据变动。才不能不必须走Hibernate这条路。


额~~~你说的也对,不过那样又是一个连接池了。
实际上,我的问题不是用不用hibernate啊,而是有没有在Hibernate nativeSQL 执行中对char(n)的正确读取方法?
4 楼 魔力猫咪 2009-09-18  
为什么呢?大不了新建一个专门的纯JDBC数据库连接就是了。你们使用了SQL,而且从这种使用上来看,也没什么缓存的问题。那么干脆就直接另建一个数据库连接好了。最多对这个连接进行限制,让其只能查询。
要不把其他持久化框架引进来。除非Hibernate使用了2级缓存,而你们的处理又会造成数据库数据变动。才不能不必须走Hibernate这条路。

相关推荐

    hibernate的第一个例子

    **标题解析:**“hibernate的第一个例子”表明这是一个关于Hibernate框架的基础教程,主要目标是展示如何使用Hibernate进行数据持久化操作。 **描述分析:**描述提到这是一个超级简单的例子,包含一个持久化对象...

    hibernate第一个hibernate

    《Hibernate入门:初识与实践》 ...总之,"hibernate第一个hibernate"项目是一个绝佳的起点,它将引导你了解并掌握Hibernate的基本概念和操作。通过实践,你可以逐步熟悉ORM思想,为后续的Java开发奠定坚实的基础。

    第一个手写Hibernate

    "第一个手写Hibernate"项目旨在帮助开发者深入理解Hibernate的工作原理,通过手动编写相关代码,以实践的方式来学习和掌握Hibernate的核心概念。 **一、Hibernate简介** Hibernate是一个开源的ORM框架,它允许...

    菜鸟快速运行第一个hibernate

    ”表达了这个教程的目标是避免新手在学习过程中遇到常见问题,确保他们能够顺利地完成第一个Hibernate应用的搭建和运行。 **知识点详解** 1. **Hibernate简介**:Hibernate是一个开源的ORM框架,它将Java对象与...

    springMvc+Hibernate实现的一个问题管理系统

    本文将深入探讨如何使用SpringMvc和Hibernate这两个强大的框架,构建一个功能完善的问题管理系统。首先,我们来看看SpringMvc和Hibernate的核心概念及其在项目中的作用。 SpringMvc是Spring框架的一个模块,专门...

    hibernate第一个例子

    【hibernate第一个例子】 在Java开发中,Hibernate是一个非常重要的对象关系映射(ORM)框架,它极大地简化了数据库操作。本示例将引导初学者了解如何使用Hibernate进行简单的数据库连接和操作。 首先,我们需要...

    Hibernate面试题专栏 - 最全的Hibernate面试题, Hibernate笔试题, Hibernate问题

    Hibernate是一个用于简化Java数据库编程的开源框架,它提供了一种在Java应用程序中持久化对象的方式,避免了直接编写SQL语句,提高了开发效率。 **1. Hibernate基本概念** - **对象关系映射(ORM)**: ORM是将...

    hibernate完整的一个项目

    **hibernate完整的一个项目** 本项目旨在提供一个完整的Hibernate框架的实现,涵盖了从环境搭建到实际应用的全过程。Hibernate是Java开发中的一个强大的对象关系映射(ORM)框架,它简化了数据库与Java对象之间的...

    Hibernate 配置各种数据库

    Hibernate 是一个基于 Java 的持久层框架,提供了一个抽象的数据访问层,能够与多种数据库进行集成。在 Hibernate 的配置文件中,我们可以配置不同的数据库连接,包括驱动程序、URL 等信息。 配置 Hibernate 连接...

    hibernate需要的10个jar

    在Java开发领域,Hibernate是一个非常重要的对象关系映射(ORM)框架,它简化了数据库操作,使得开发者可以使用面向对象的方式来处理数据。当涉及到Hibernate项目时,为了使其正常运行,通常需要一系列的JAR(Java ...

    Hibernate Hibernate5 讲义 PDF

    Hibernate是一个开源的对象关系映射(ORM)框架,它封装了JDBC(Java Database Connectivity)的复杂性,并允许Java开发者以面向对象的方式操作数据库。Hibernate框架被广泛应用于企业级Java应用程序中,可以与...

    Hibernate实践例子程序

    Hibernate 是一个开源的O/R mappimg的框架,基于JDBC提供了一种持久性数据管理的方案,相对于EntityBean来说是相当轻量级的。由于Hibernate是基于 JDBC的,所以它的数据库查寻的能力相对于CMP来说也是异常强大的,...

    我的第一个hibernate例子

    # Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的...

    Hibernate入门到精通

    Hibernate 是一个基于Java的ORM(Object-Relational Mapping,对象关系映射)框架,它提供了一种简洁高效的方式来访问和操作关系数据库。下面是 Hibernate 的主要知识点: Hibernate 简介 Hibernate 是一个开源的...

    Hibernate相关jar包括新版本jdk不兼容旧版本的jar.zip

    因此,"解决Hibernate与jdk新版本不兼容的jar问题"可能是提供了一个升级后的Hibernate库,或者是包含了特定的补丁或者配置,使得Hibernate能够在新JDK环境下正常工作。 在"lib"目录下,可能包含了所有必要的...

    Hibernate update问题

    Hibernate,一个强大的Java对象关系映射(ORM)框架,极大地简化了数据库操作。在处理数据更新时,Hibernate提供了多种方法,但同时也可能会遇到一些常见问题。本篇文章将深入探讨Hibernate更新机制及其可能遇到的...

    第一个Hibernate代码, Hello Hibernate

    "第一个Hibernate代码, Hello Hibernate" 这个标题表明我们将要探讨的是一个初学者级别的Hibernate教程,可能是通过一个简单的项目或示例来介绍如何使用Hibernate框架。Hibernate是一个开源的对象关系映射(ORM)...

    一个好的hibernate源代码有server2008数据库

    标题提到的是“一个好的hibernate源代码有server2008数据库”。这里我们可以理解为,这是一个关于Hibernate框架的示例项目,它使用了Microsoft SQL Server 2008作为后端数据库。Hibernate是Java开发中常用的一个对象...

    JSP+Hibernate实现留言板

    Hibernate是一个流行的开源对象关系映射(ORM)框架,它简化了Java应用与关系型数据库之间的交互。通过Hibernate,开发者可以使用面向对象的方式处理数据库操作,而无需关心底层SQL语句的编写。 在留言板系统中,...

    Hibernate,hibernate笔记

    Hibernate 是一个开源的对象关系映射(ORM)框架,它允许Java开发者使用面向对象的方式来操作数据库。这个框架将数据库操作转化为对Java对象的操作,简化了数据持久化的复杂度。以下是对Hibernate的一些关键知识点的...

Global site tag (gtag.js) - Google Analytics