JPA + StoredProcedureCall + тип объекта IN параметр - PullRequest
2 голосов
/ 03 февраля 2012

Я пытаюсь сделать простую вещь: вызвать хранимую процедуру с параметром типа объекта.

Вот что у меня в дб:

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

и

CREATE OR REPLACE PROCEDURE TEST_PROC 
(
  PARAM1 IN TEST_TYPE 
) AS 
BEGIN
END TEST_PROC;

Вот что у меня в коде 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;
    }
}

и

    @PostConstruct
    public void init()
    {

        StoredProcedureCall call = new StoredProcedureCall();
        call.setProcedureName("TEST_PROC");
        call.addNamedArgument("PARAM1", "PARAM1", Types.STRUCT, "TEST_TYPE", TestStruct.class);

        DataReadQuery dataReadQuery = new DataReadQuery(call);
        dataReadQuery.addArgument("PARAM1");

        TestStruct testStruct = new TestStruct();
        List args = new ArrayList();
        args.add(testStruct);

        Object result = ((EntityManagerImpl)em.getDelegate()).getSession().executeQuery(dataReadQuery,args);
    }

вот что я получаю во время выполнения:

Internal Exception: java.sql.SQLException: Invalid column type
Error Code: 17004
Call: BEGIN TEST_PROC(PARAM1=>?); END;
    bind => [1 parameter bound]
Query: DataReadQuery()

Я думаю, что я совершенно не понимаю, что такое структура использования с JPA

пожалуйста, помогите мне, добрые люди:)

Какой самый короткий способ заставить это работать?

Ответы [ 4 ]

1 голос
/ 04 февраля 2012

Пожалуйста, отправьте полный код. Для вызова хранимых процедур с использованием 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);
    }
}

для лучшей помощи, вы должны объяснить полную ситуацию.

0 голосов
/ 28 февраля 2019

Возможно, вы захотите использовать SimpleJdbcCall с Types.STRUCT.

Вот пример: https://docs.spring.io/spring-data/jdbc/old-docs/2.0.0.M1/reference/html/orcl.datatypes.html

0 голосов
/ 27 ноября 2012

Кажется, что пропускает дескрипторы для аннотированных классов @Struct и @Embeddable, если на них не ссылается какой-либо другой класс. Самый короткий способ заставить это работать - использовать обходной путь, основанный на этом предположении. Поместите дополнительный класс в банку, где находится ваш META-INF/persistence.xml:

@Entity
public class StructEntitiesWorkaround {

  @Id
  private String id;

  private TestStruct testStruct;

}
0 голосов
/ 06 февраля 2012

Ваш код выглядит правильно.

Убедитесь, что дескриптор был определен для структуры. (т.е. session.getDescrptor (TestStruct.class))

Можете ли вы вызывать хранимые процедуры с другими типами?

Какую базу данных вы используете, правильно ли вы установили платформу на Oracle?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...