- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
Oracle 支持使用 VARRAYS 和 NESTED TABLE 数据类型,允许多值属性。 ( http://www.orafaq.com/wiki/NESTED_TABLE )
我目前正在使用 Hibernate 3 作为我的 ORM 框架,但我看不到如何将 Hibernate 映射到我的数据库中的 NESTED TABLE/VARRAY 数据类型。
我查看了在 Hibernate 中定义自定义类型,但没有成功。 (Hibernate 甚至可以处理取消嵌套子表所需的“COLUMN_VALUE”Oracle 关键字吗?)
有谁知道如何在 Hibernate 中实现这些数据类型?
谢谢大家的帮助。
-- 待定。
最佳答案
Oracle 的 TABLE OF NUMBERS 的 Hibernate 用户类型。在这里找到 OracleNativeExtractor:https://community.jboss.org/wiki/MappingOracleXmlTypeToDocument .字符串 YOUR_CUSTOM_ARRAY_TYPE 替换为您的姓名。
import oracle.sql.ARRAY;
import oracle.sql.ArrayDescriptor;
import org.apache.commons.lang.ArrayUtils;
import org.hibernate.HibernateException;
import org.hibernate.usertype.UserType;
import java.io.Serializable;
import java.sql.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class ArrayUserType
implements UserType, Serializable {
private static final OracleNativeExtractor EXTRACTOR = new OracleNativeExtractor();
@Override
public int[] sqlTypes() {
return new int[]{Types.ARRAY};
}
@Override
public Class returnedClass() {
return List.class;
}
@Override
public boolean equals(Object x, Object y) throws HibernateException {
if (x == null && y == null) return true;
else if (x == null && y != null) return false;
else return x.equals(y);
}
@Override
public int hashCode(Object x) throws HibernateException {
return x.hashCode();
}
@Override
public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws HibernateException, SQLException {
return Arrays.asList(ArrayUtils.toObject(((ARRAY) rs.getObject(names[0])).getLongArray()));
}
@Override
public void nullSafeSet(PreparedStatement st, Object value, int index) throws HibernateException, SQLException {
ARRAY array = null;
if (value != null) {
Connection nativeConn = EXTRACTOR.getNativeConnection(st.getConnection());
ArrayDescriptor descriptor =
ArrayDescriptor.createDescriptor("YOUR_CUSTOM_ARRAY_TYPE", nativeConn);
array = new ARRAY(descriptor, nativeConn, ((List<Long>) value).toArray(new Long[]{}));
}
st.setObject(1, array);
}
@Override
public Object deepCopy(Object value) throws HibernateException {
if (value == null) return null;
return new ArrayList<Long>((List<Long>) value);
}
@Override
public boolean isMutable() {
return false;
}
public Object assemble(Serializable _cached, Object _owner)
throws HibernateException {
return _cached;
}
public Serializable disassemble(Object _obj)
throws HibernateException {
return (Serializable) _obj;
}
@Override
public Object replace(Object original, Object target, Object owner) throws HibernateException {
return deepCopy(original);
}
}
关于java - Hibernate 和 Oracle VARRAYS/NESTED TABLE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4712566/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求提供代码的问题必须表现出对所解决问题的最低限度理解。包括尝试过的解决方案、为什么它们不起作用,以及预
我有一张员工表。其中一列是一个 varray() ,其中包含他们办公室的多个房间#。我正在寻找一个简单的查询,该查询将比较每个员工以查看他们是否共用一个办公室。 SELECT E1.Name, E2
这看起来很简单,但我在文档中找不到答案。 与嵌套表一样,我们可以将 TABLE() 与 COLUMN_VALUE 伪列一起用于 varrays。 create or replace type NUMB
我有一个表,其中有一列定义为已定义类型的 varray。生产表比下面的例子复杂得多。 我能够在 varray 的类型中选择单个列。但是我想用一个简单的更新语句来更新表(而不是通过 pl/sql 例程)
在以下示例中,我创建了一个包含 3 个项目的 VARRAY。 TEST@XE> select t1, t2.* from 2 (select 'X' as t1 from dual UNION
我有一个像这样的类型声明: FUNCTION ... IS TYPE stati_va IS VARRAY (10000) OF varchar(1); stati
我知道两者的基本区别和用途。但是,我正在寻找的答案是,为什么引入 VARRAY ? 因为,我们可以使用 NESTED TABLE 做同样的事情,使用 VARRAY 可以做同样的事情,反之亦然,在某些情
我有一个定义为这样的自定义类型: CREATE TYPE myType_t AS VARRAY(2) of char(10); 是否可以在 char(10) 类型上添加检查约束,以便 myType_t
我在 TOAD 中调试带有两个 VARRAY 参数的程序时遇到了一些麻烦。我在数据库中定义了这个 VARRAY: CREATE OR REPLACE TYPE BDD_ACTIVOSEPAREP.TO
这是我的代码,其中 METHODARGDATATYPE_VARRAY 是表中第五列的变量,第一列具有与“t”连接的自动生成的序列。 String arrayElements[] = { "Test3
我正在尝试使用 jdbc 插入具有两个 VARRAY 列的表;一个是 int 的 VARRAY,另一个是 varchar2 的 VARRAY。第一列正在完美插入。但是,第二个将所有值插入为 null。
这是我的代码,其中 METHODARGDATATYPE_VARRAY 是表中第五列的变量,第一列具有与“t”连接的自动生成的序列。 List str= new ArrayList();
我有一个 VARRAY,我想通过使用循环向这个 VARRAY 添加元素。这是我迄今为止所尝试的。 DECLARE TYPE code_array_ IS VARRAY(26) OF VARCHAR2
我的表中有一个列,其中包含 VARCHAR2 的 VARRAY, 所以我想创建一个选择语句,给我所有的列 以及 VARRAY 的所有对象彼此相邻, 有没有办法做到这一点? 例子: CREATE TYP
我想从 oracle 函数返回一个 varray,但我不知道该怎么做。 到目前为止,这是我尝试过的。 set serveroutput on; declare type array_t is v
我正在尝试在 PHP 代码中创建一个表,以便在浏览器中打开以创建该表。我需要表中的可变数组并具有在 Oracle 中创建它的正确代码: CREATE TYPE ReportEntries_Type A
谁能告诉我这段代码有什么问题。我的目标是编写一个程序,该程序传递员工姓名,将员工表中的所有姓名和薪水加载到 VARRAY 中,然后在屏幕上打印出姓名和薪水。 CREATE OR REPLACE PRO
我试图找出可能的 上限 PL/SQL 中的 VARRAY。 我们肯定可以将 VARRAY 类型定义为 TYPE type_name IS {VARRAY | VARYING ARRAY} (size_
这里的问题有点宽泛,但这里是 我正在尝试调用一个 Oracle 存储过程,它返回一个 VARRAY,它是根据我的一个表上的 ROWTYPE 构造的。为简单起见,假设该表如下所示: MY_TABLE I
我想通过 type 属性或任何解决方法来检索元素 varray 存储的类型。 例如我们的类型是这样定义的 CREATE TYPE "READINGS" AS VARRAY (200) OF NUMBE
我是一名优秀的程序员,十分优秀!