Я следовал прекрасному руководству Как сопоставить массивы Java и SQL с JPA и Hibernate , чтобы отобразить специальный тип sql tsrange
в hibernate. Я решил использовать дескрипторы Java и SQL, а не пользовательский тип, потому что обработка jdbc sql должна быть лучше.
Когда я пытаюсь сохранить сущность со столбцом с именем time range и типом tsrange, я получаю всегда: ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (default task-2) ERROR: column "time_range" is of type tsrange but expression is of type character varying
Hinweis: You will need to rewrite or cast the expression.
Насколько я понимаю, мне нужно написать специальный / нестандартный тип sql с помощью метода setObject и типа Type.OTHER или Type.JAVA_OBJECT. Какой предпочтительный способ поместить тип sql диапазона в PreparedStatement?
Источник BasicBinder, где я заполняю подготовленный оператор jdbc, sqlString содержит "[2019-01-14 13:06:26, 2019-01-14 13:12:39]"
:
@Override
public <X> ValueBinder<X> getBinder(JavaTypeDescriptor<X> javaTypeDescriptor) {
return new BasicBinder<X>(javaTypeDescriptor, this) {
@Override
protected void doBind(PreparedStatement st, X value, int index, WrapperOptions options) throws SQLException {
String sqlString = javaTypeDescriptor.toString(value);
// I tried the following statements:
//st.setObject(index, sqlString, getSqlType());
//st.setObject(index, sqlString);
//st.setString(index, sqlString+"::tsrange");
st.setString(index, sqlString);
}
@Override
protected void doBind(CallableStatement st, X value, String name, WrapperOptions options) throws SQLException {
st.setObject(name, javaTypeDescriptor.toString(value));
}
};
}
Вот определение столбца сущности:
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Basic
@Column(nullable = false, name = "time_range", columnDefinition = "tsrange")
@Type(type="com.example.model.types.TsRange")
private PgTsRange timeRange;