gpt4 book ai didi

java - 如何将带有 jdbc 准备语句的 SqlDescriptor 写入 tsrange 列?

转载 作者:行者123 更新时间:2023-11-29 13:41:52 25 4
gpt4 key购买 nike

我遵循了出色的指南 How to map Java and SQL arrays with JPA and Hibernate将特殊的 sql 类型 tsrange 映射到 hibernate 。我决定使用 Java 和 SQL 描述符而不是用户类型,因为 jdbc sql 处理应该更好。

当我尝试使用名为时间范围和类型 tsrange 的列来持久化实体时,我总是得到:错误 [org.hibernate.engine.jdbc.spi.SqlExceptionHelper](默认任务 2)错误: “time_range”列的类型为 tsrange,但表达式的类型为 character varying
备注:您需要重写或强制转换表达式。

我的理解是,我需要使用 setObject 方法和类型 Type.OTHER 或 Type.JAVA_OBJECT 编写一个特殊/非标准的 sql 类型。将范围 sql 类型放入 PreparedStatement 的首选方法是什么?

BasicBinder源码,这里我填了jdbc prepared statement,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;

最佳答案

The Hibernate Types project offers a PostgreSQLRangeType supports the PostgreSQL TSRANGE column type.

您需要做的第一件事是使用以下 Maven 依赖项:

<dependency>
<groupId>com.vladmihalcea</groupId>
<artifactId>hibernate-types-52</artifactId>
<version>${hibernate-types.version}</version>
</dependency>

之后,您可以像这样映射您的 PostgreSQL 范围:

@Entity(name = "Book")
@Table(name = "book")
@TypeDef(
typeClass = PostgreSQLRangeType.class,
defaultForType = Range.class
)
public class Book {

@Id
@GeneratedValue
private Long id;

@NaturalId
private String isbn;

private String title;

@Column(
name = "price_cent_range",
columnDefinition = "numrange"
)
private Range<BigDecimal> priceRange;

@Column(
name = "discount_date_range",
columnDefinition = "daterange"
)
private Range<LocalDate> discountDateRange;

//Getters and setters omitted for brevity
}

RangePostgreSQLRangeType 类来自 Hibernate Types 项目。

关于java - 如何将带有 jdbc 准备语句的 SqlDescriptor 写入 tsrange 列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54181743/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com