前段时间工作中使用jpa做持久化,数据库使用informix,在映射大文本字段的时候出了一些问题,informix数据库用的人比较少,所以从网上查找相应的解决方法颇费了不少功夫,现在有空闲了,将解决方法整理了一下, 共享出来。
在持久化类里面使用如下方式映射大文本字段:
@Lob
@Basic(fetch=FetchType.EAGER)
@Column(name="result_content")
public String getResultContent() {
return resultContent;
}
从持久化类自动生成数据库表时报错了,错误的具体内容记不得了,反正说是映射大文本字段的时候出的错。于是就上网搜informix使用jpa怎么映射大文本字段。
从网上搜“informix hibernate 大文本”,搜出这么个东西来:
package org.hibernate.dialect;
import java.sql.Types;
/**
* Dialect for Informix 10.
* <ul>
* <li>hint for first rows</li>
* <li>support for limitOffset</li>
* <li>added types for BLOB and CLOB</li>
* </ul>
*/
public class Informix10Dialect extends InformixDialect {
/**
*
*/
public Informix10Dialect() {
super();
registerColumnType( Types.BLOB, "blob" );
registerColumnType( Types.CLOB, "clob" );
}
public boolean useMaxForLimit() {
return false;
}
public boolean supportsLimitOffset() {
return true;
}
public String getLimitString(String querySelect, int offset, int limit) {
String os = "";
if (offset > 0) os = " skip " + offset;
return new StringBuffer( querySelect.length() + 24 + os.length())
.append(querySelect)
.insert( querySelect.toLowerCase().indexOf( "select" ) + 6,
" {+ FIRST_ROWS }" + os + " first " + limit )
.toString();
}
}
该类扩展了hibernate自带的InformixDialect,提供了informix 10 的使用first和skip
进行分页查询,
并添加了clob和blob类型的映射。这个类是外国人写的,他们在使用hibernate的过程中发现了InformixDialect不支持skip,并缺少blob和clob映射的问题,就自行扩展了InformixDialect,并提交给了hibernate,希望hibernate的以后版本中添加支持informix 10的新特性的Dialect。
因为informix 10以前的版本分页查询只支持使用first,informix 10 开始,添加了skip关键字,hibernate自带的InformixDialect生成的sql分页语句不使用skip,所以上面的类中的三个方法添加了informix 10 的skip关键字支持。
(但是如果你的informix版本低于informix 10,应该将那三个方法注释掉。)
(在informix 10及以后版本中具体如何使用first,skip实现分页查询,网上能方便的找到。)
上面的类还增加了blob和clob两种字段的映射,开始我以为我项目中的大文本映射错误只是因为InformixDialect中缺少相应的大文本字段的映射,所以我直接将上面的类添加到项目中,并在项目的配置文件中设置使用该dialect,
修改后,在保存的时候可以将字符串成功插入到数据库的大文本字段中,但是在查询的时候不能从大文本字段中解析出文本内容来。
郁闷之余,又上网查informix数据库支持的数据类型,查到原来informix使用text类型存放大文本字段,于是我将上面的类中的构造方法改为:
public Informix10Dialect() {
super();
//registerColumnType( Types.BLOB, "blob" );
registerColumnType( Types.CLOB, "text" );
}
持久化类中的大文本字段的annotation不做任何修改。
改完后启动项目测试一下,OK,大功告成,即能成功的将文本存进去又能将文本解析出来并设置到持久化对象的相应字段中。
最后说明一下,我项目中使用的informix的版本比较低,不支持skip,所以我把那三个添加skip支持的方法注释掉了。
我使用的InformixDialect全文如下:
package org.hibernate.dialect;
import java.sql.Types;
/**
* Dialect for Informix 10.
* <ul>
* <li>hint for first rows</li>
* <li>support for limitOffset</li>
* <li>added types for BLOB and CLOB</li>
* </ul>
*/
public class Informix10Dialect extends InformixDialect {
/**
* 添加BLOB与CLOB类型的映射
*/
public Informix10Dialect() {
super();
// registerColumnType(Types.BLOB, "blob" );
registerColumnType(Types.CLOB, "text" );
}
//informix10支持使用skip m first n进行分页
// public boolean useMaxForLimit() {
// return false;
// }
//
// public boolean supportsLimitOffset() {
// return true;
// }
//
// public String getLimitString(String querySelect, int offset, int limit) {
// String os = "";
// if (offset > 0) os = " skip " + offset;
// return new StringBuffer( querySelect.length() + 24 + os.length())
// .append(querySelect)
// .insert( querySelect.toLowerCase().indexOf( "select" ) + 6,
// " {+ FIRST_ROWS }" + os + " first " + limit )
// .toString();
// }
}
分享到:
相关推荐
在数据库中,索引对效率的影响可以说是决定性的。所以,索引使用的好坏直接影响系统的效率。每一索引的建立都要根据系统的使用综合考虑,哪些语句使用最频繁,这些语句的where 条件是什么,对当前表的更新频率如何。...
informix数据库的配制,这是具体配制informix数据库。
如何解决informix数据库锁表问题.doc
informix 数据库升级 迁移 migration
informix数据库驱动jar包: ifxjdbc.jar ifxjdbcx.jar ifxlang.jar ifxlsupp.jar ifxsqlj.jar ifxtools.jar
Informix 数据库驱动,本人亲测有效. Java编程于Mysql等数据库类似,非常简单.
Informix数据库与设计指南
是有关linux下informix数据库的一些操作
Linux下安装informix数据库,11.5版本了 实际安装过
Informix数据库的安全审计
第二章 INFORMIX 数据库系统概述 5 2.1 INFORMIX-ONLINE 联机数据库. 5 2.2 INFORMIX-SQL 数据库操纵语言. 5 2.3 INFORMIX-ISQL 数据库操纵工具. 5 2.4 INFORMIX-ESQL/C 数据库编程语言. 6 第三章 INFORMIX-ONLINE ...
Informix数据库服务器体系架构文档,是IBM培训的资料,内容很全很详细,是学习informix的好文档
informix 数据库管理和维护过程中的一些常见的问题总结!
Informix数据库基础
企业用的informix 数据库培训文档。其中有doc和pdf文档。doc很简洁,很适合快速入门。基本语句都有。
主要针对Informix数据库做一个系统的讲解
学习informix最全面的资料,没有之一。
AIX安装informix数据库注意,在开始安装的时候,phydbs ,logdbs,tmpdbs等等都是默认分配rootdbs的空间,所以rootdbs的空间要足够大。否则,之后的初始化会失败。
Linux下Informix数据库简明安装指南