Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA&x2B;StoredProcedureCall&x2B;参数中的对象类型_Java_Oracle_Stored Procedures_Eclipselink - Fatal编程技术网

Java JPA&x2B;StoredProcedureCall&x2B;参数中的对象类型

Java JPA&x2B;StoredProcedureCall&x2B;参数中的对象类型,java,oracle,stored-procedures,eclipselink,Java,Oracle,Stored Procedures,Eclipselink,我尝试做一件简单的事情:调用具有对象类型参数的存储过程 这就是我在db中的内容: create or replace TYPE TEST_TYPE AS OBJECT ( test_field varchar(100) ) 及 这是我的java代码中的内容: @Embeddable @Struct(name = "TEST_TYPE", fields = {"TEST_FIELD"}) public class TestStruct { private String testF

我尝试做一件简单的事情:调用具有对象类型参数的存储过程

这就是我在db中的内容:

create or replace
TYPE TEST_TYPE AS OBJECT 
(
  test_field varchar(100)
)

这是我的java代码中的内容:

@Embeddable
@Struct(name = "TEST_TYPE", fields = {"TEST_FIELD"})
public class TestStruct
{

    private String testField;

    public String getTestField() {
        return testField;
    }

    public void setTestField(String testField) {
        this.testField = testField;
    }
}

这是我在运行时得到的结果:

Internal Exception: java.sql.SQLException: Invalid column type
Error Code: 17004
Call: BEGIN TEST_PROC(PARAM1=>?); END;
    bind => [1 parameter bound]
Query: DataReadQuery()
我想我完全不理解JPA使用结构的主题

请帮帮我,好人:)


最短的方法是什么?请发送完整的代码。 对于使用Spring调用存储过程,必须扩展StoredProcedure类。如果您发送完整的代码,我可以更好地帮助您。示例伪代码:

class CustomStoredProcedure extends org.springframework.jdbc.object.StoredProcedure
{
    CustomStoredProcedure()
    {
        super([your-data-source], [package-name]);  
        declareParameter(new SqlParameter([your-struct-name]), Types.STRUCT));
        compile();
    }

    Map<String, Object> execute([your-parameter])
    {
        return super.execute(inputs);
    }
}
类CustomStoredProcess扩展了org.springframework.jdbc.object.StoredProcess
{
CustomStoredProcedure()
{
超级([您的数据源],[包名]);
declareParameter(新的SqlParameter([您的结构名称]),Types.struct));
编译();
}
映射执行([您的参数])
{
返回super.execute(输入);
}
}

为了获得更好的帮助,您必须解释完整的情况。

您的代码看起来是正确的


确保为结构定义了描述符。(即session.getDescrptor(TestStruct.class))

可以用其他类型调用存储过程吗

您使用的是什么数据库,您是否已将平台正确设置为Oracle?

似乎跳过了
@Struct
@embeddeble
注释类的描述符,除非它们被其他类引用。使其工作的最短方法是基于此假设使用变通方法。在您的
META-INF/persistence.xml
所在的jar中添加其他类:

@Entity
public class StructEntitiesWorkaround {

  @Id
  private String id;

  private TestStruct testStruct;

}

您可能希望将
SimpleJdbcCall
Types.STRUCT
一起使用


下面是一个示例:

这是一个完整的情况-我只是在测试如何使用EclipseLink JPA2.0实现解决常见问题。顺便说一句,AFAIK Spring没有实现JPA——我错了吗?你说对了,Spring没有实现JPA。我不使用EclipseLink。我的解决方案独立于jpa实现,它由spring框架提供,工作正常。如果只想使用EclipseLink,则必须阅读其文档。“确保为结构定义了描述符”是否意味着描述符将由于注释而自动创建?最近我尝试手动设置它们:`ObjectRelationalDataTypeDescriptor d=new ObjectRelationalDataTypeDescriptor();d、 setJavaClass(TestStruct.class);d、 描述符聚合();d、 设置结构名称(“测试类型”);d、 addDirectMapping(“测试字段”、“getTestField”、“setTestField”、“testField”);d、 setShouldOrderMappings(false);((EntityManagerImpl)em.getDelegate()).getServerSession().addDescriptor(d)`我可以用varchar这样的简单类型调用存储过程。我使用的是Oracle 10和适当的jdbc驱动程序。描述符应该从注释中创建,但是如果您没有在persistence.xml中指定类,或者有其他问题,则可能没有,因此检查它是否正确是一个好主意。当您在代码中定义它时,它工作了吗?不,它没有。我的同事告诉我,他在我们使用的EclipseLink库中发现了一些bug
class CustomStoredProcedure extends org.springframework.jdbc.object.StoredProcedure
{
    CustomStoredProcedure()
    {
        super([your-data-source], [package-name]);  
        declareParameter(new SqlParameter([your-struct-name]), Types.STRUCT));
        compile();
    }

    Map<String, Object> execute([your-parameter])
    {
        return super.execute(inputs);
    }
}
@Entity
public class StructEntitiesWorkaround {

  @Id
  private String id;

  private TestStruct testStruct;

}