Я работаю над этой задачей уже несколько дней и пролистал много информации, поэтому надеюсь, что найду ответы на свои вопросы здесь. Я пытаюсь вызвать функцию, которая принимает тип объекта в качестве входных данных и возвращает тот же тип объекта. Вызов осуществляется через класс 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