Spring jdb c функции с типом объекта - PullRequest
0 голосов
/ 29 января 2020

Я работаю над этой задачей уже несколько дней и пролистал много информации, поэтому надеюсь, что найду ответы на свои вопросы здесь. Я пытаюсь вызвать функцию, которая принимает тип объекта в качестве входных данных и возвращает тот же тип объекта. Вызов осуществляется через класс SimpleJdbcCall. Сопоставление класса с типом объекта выполняется через интерфейс SQLData. Моя первая проблема - я не могу прочитать / записать строковое значение.

{"id": 6, "name": null, "age": 25, "sqltypeName": "ACTOR_TYPE "}

Вторая проблема - написание правильного кода для получения ответа, возвращаемого функцией. В данный момент я пытаюсь понять, как код работает с помощью процедуры. Я прошу вас помочь в этой ситуации с советами или документацией для этой задачи, я прилагаю существующий код codeenter здесь. Мой класс

public class Actor {

    private Long id;
    private String name;
    private int age;


    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String toString() {
        return "Actor: [" + id + "] " + name + " " + age;
    }

}

и

public class SqlActor extends Actor implements SQLData {

@Override
public String getSQLTypeName() throws SQLException {
    return "ACTOR_TYPE";
}

@Override
public void readSQL(SQLInput stream, String typeName) throws SQLException {
    setId(Long.valueOf(stream.readLong()));
    setName(stream.readString());
    setAge(stream.readInt());
}

@Override
public void writeSQL(SQLOutput stream) throws SQLException {
    stream.writeLong(getId().longValue());
    stream.writeString(getName());
    stream.writeInt(getAge());
} }

и класс DataService

@Autowired
public DataService(JdbcTemplate jdbcTemplate) {
    this.jdbcTemplate = jdbcTemplate;
}

public Actor addActor(final SqlActor actor) { //        SimpleJdbcCall jdbc = new SimpleJdbcCall(jdbcTemplate).withProcedureName("add_actor");
    SimpleJdbcCall jdbc = new SimpleJdbcCall(jdbcTemplate).withProcedureName("add_actor")
            .declareParameters(
            new SqlParameter("in_actor", OracleTypes.STRUCT, "ACTOR_TYPE")
    );
    SqlParameterSource input = new MapSqlParameterSource()
            .addValue("in_actor", actor);
    jdbc.execute(input);
    return actor;
}

public Actor getActor(long id) {
    SimpleJdbcCall jdbc = new SimpleJdbcCall(jdbcTemplate).withProcedureName("get_actor").declareParameters( //                new SqlParameter("in_actor_id", OracleTypes.NUMBER)
              new SqlOutParameter("out_actor", OracleTypes.STRUCT, "ACTOR_TYPE", new SqlReturnSqlData(SqlActor.class))
    );
    SqlParameterSource input = new MapSqlParameterSource()
            .addValue("in_actor_id", id);
    SqlActor actor = jdbc.executeObject(SqlActor.class, input);
    return actor;
}

}

При написании этого примера я использовал эту документацию: https://docs.spring.io/spring-data/jdbc/old-docs/1.2.1.RELEASE/reference/html/orcl.datatypes.html

...