java Hibernate 处理 oracle xmltype类型

时间:2023-03-09 02:55:21
java Hibernate 处理 oracle xmltype类型

网上关于如何处理oracle xmltype类型的博客很多,我现在分享的是针对具体业务来的,我在oracle数据库entity表中detail插入了一条xmltype类型的数据

xml的详细内容如下:

<Family>
<Person>
<name>Jack</name>
<phone>123</phone>
<address>
<company>常州</company>
<home>常州</home>
</address>
</Person>
<Person>
<name>Tom</name>
<phone>456</phone>
<address>
<company>无锡</company>
<home>无锡</home>
</address>
</Person>
<Person>
<name>Andy</name>
<phone>789</phone>
<address>
<company>苏州</company>
<home>苏州</home>
</address>
</Person>
</Family>

现在要实现的业务是在前端表格中显示相应数据

java Hibernate 处理 oracle xmltype类型

我想到了3种解决途径,后来花费了一天功夫,才解决了这个业务需求。

方案一、采用oracle通过Hibernate在java中映射的实体才操作

oracle xmltype类型继承clob大数据类型,通过Hibernate操作在java中映射的实体类型为string类型,再通过dao层去存取该实体。

这个时候就遇到问题了,将xml编辑为string类型后entity.setDetail(xml);sava(entity);数据中数据被更新了,没有问题,但是entity,getDetail()的时候获得的数据为null但是数据库却是有数据的。

在花费了一段时间之后,发现需要自己编写一个类去替换string,最后取出的类型是docoment类型,将document类型做处理就好了,以下附上相关的一些资料:

1、使用Hibernate4处理Oracle XmlType字段类型

2、解决:Weblogic容器、SSH框架下Hibernate映射Oracle XMLType方法与Jar包冲突

3、java中Document类使用方法

方案二、采用Hibernate连接写sql获取xmltype的值

String sql = "select en.detail as de from entity en where en.id = '123'";
List<Map<String,Object>> list = jdbcTemplate.queryForList(sql);

结果发现报错,javax.persistence.PersistenceException: org.hibernate.MappingException: No Dialect mapping for JDBC type: 2009

查资料没发现有效的解决方案,舍弃

方案三、使用oracle自带的处理xmltype的函数进行数据读取

Oracle 中XML处理函数介绍,附上函数资料,但是发现这样子取数据必须知道数据条数而且取很麻烦

在查询资料以后发现,对与获取相同标签下的数据的时候可以使用xmltable函数,附上sql语句:

select en.id, x.*
from entity en,xmltable('/Family/Person' passing en.detail columns name path 'name',
phone path 'phone') x
where ed.id = '123'

需要注意的问题是,使用这种方法的时候,如果节点下还有子节点,那么会报方案二的错误,暂时没有找到解决方案,要处理这种情况还是选择方案一吧。

暂时就想到这几种解决方案。

相关文章