Java JPA&x2B;StoredProcedureCall&x2B;参数中的对象类型
我尝试做一件简单的事情:调用具有对象类型参数的存储过程 这就是我在db中的内容: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
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;
}