Spring 数据 JDBC - POJO 中的 Clob 列到字符串 属性 不起作用
Spring Data JDBC - Clob column to String property in POJO not working
我有一个带有 table 的 Oracle 数据库,其中有一个 DESCRIPTION
类型为 CLOB 的列。
我的 POJO 看起来像这样:
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import org.springframework.data.relational.core.mapping.Column;
import org.springframework.data.relational.core.mapping.Table;
import org.springframework.data.annotation.Id;
import lombok.Data;
@Data
@Table("MY_ITEMS")
@JsonIgnoreProperties(ignoreUnknown = true)
public class MyItem {
@Column("ID") @Id Long id;
@Column("DESCRIPTION") String description;
}
我的存储库如下所示
import java.util.List;
import com.myapp.mymodel.MyItem;
import org.springframework.data.jdbc.repository.query.Query;
import org.springframework.data.repository.CrudRepository;
public interface MyItemsRepository extends CrudRepository<MyItem, Long> {
// other methods deleted...
@Query(
"select m.ID"
+ ", m.DESCRIPTION"
+ " from MY_ITEM m "
)
List<MyItem> findMyItems();
}
当我调用存储库方法时,我收到一条错误消息,指出没有 CLOB 到字符串的转换器。
感谢任何帮助。
这里有一个很好的例子可以解决这个问题:
https://github.com/spring-projects/spring-data-examples/tree/master/jdbc/basics
解决方案相当于添加一个注册转换器的配置,该转换器可以将 CLOB
数据提取到 String
属性
import java.sql.Clob;
import java.sql.SQLException;
import java.util.Arrays;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.convert.converter.Converter;
import org.springframework.data.jdbc.core.convert.JdbcCustomConversions;
import org.springframework.data.jdbc.repository.config.AbstractJdbcConfiguration;
import org.springframework.data.jdbc.repository.config.EnableJdbcRepositories;
import org.springframework.data.relational.core.mapping.Embedded.Nullable;
@Configuration
@EnableJdbcRepositories
public class AggregateJdbcConfiguration extends AbstractJdbcConfiguration {
@Override
public JdbcCustomConversions jdbcCustomConversions() {
return new JdbcCustomConversions(Arrays.asList(new Converter<Clob, String>() {
@Nullable
@Override
public String convert(Clob clob) {
try {
return Math.toIntExact(clob.length()) == 0 //
? "" //
: clob.getSubString(1, Math.toIntExact(clob.length()));
} catch (SQLException e) {
throw new IllegalStateException("Failed to convert CLOB to String.", e);
}
}
}));
}
}
以下是我最喜欢的一些关于该主题的视频
https://www.youtube.com/watch?v=EaHlancPA14&list=PLsC0nE-wJ1I4ra6KYXTPOXipdrJ_IdhaO&index=3&t=0s
https://www.youtube.com/watch?v=GOSW911Ox6s&list=PLsC0nE-wJ1I4ra6KYXTPOXipdrJ_IdhaO&index=4&t=59s
https://www.youtube.com/watch?v=AnIouYdwxo0&list=PLsC0nE-wJ1I4ra6KYXTPOXipdrJ_IdhaO&index=5&t=2730s
还有几篇博文
https://spring.io/blog/2018/09/24/spring-data-jdbc-references-and-aggregates
https://spring.io/blog/2018/09/17/introducing-spring-data-jdbc
我有一个带有 table 的 Oracle 数据库,其中有一个 DESCRIPTION
类型为 CLOB 的列。
我的 POJO 看起来像这样:
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import org.springframework.data.relational.core.mapping.Column;
import org.springframework.data.relational.core.mapping.Table;
import org.springframework.data.annotation.Id;
import lombok.Data;
@Data
@Table("MY_ITEMS")
@JsonIgnoreProperties(ignoreUnknown = true)
public class MyItem {
@Column("ID") @Id Long id;
@Column("DESCRIPTION") String description;
}
我的存储库如下所示
import java.util.List;
import com.myapp.mymodel.MyItem;
import org.springframework.data.jdbc.repository.query.Query;
import org.springframework.data.repository.CrudRepository;
public interface MyItemsRepository extends CrudRepository<MyItem, Long> {
// other methods deleted...
@Query(
"select m.ID"
+ ", m.DESCRIPTION"
+ " from MY_ITEM m "
)
List<MyItem> findMyItems();
}
当我调用存储库方法时,我收到一条错误消息,指出没有 CLOB 到字符串的转换器。
感谢任何帮助。
这里有一个很好的例子可以解决这个问题: https://github.com/spring-projects/spring-data-examples/tree/master/jdbc/basics
解决方案相当于添加一个注册转换器的配置,该转换器可以将 CLOB
数据提取到 String
属性
import java.sql.Clob;
import java.sql.SQLException;
import java.util.Arrays;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.convert.converter.Converter;
import org.springframework.data.jdbc.core.convert.JdbcCustomConversions;
import org.springframework.data.jdbc.repository.config.AbstractJdbcConfiguration;
import org.springframework.data.jdbc.repository.config.EnableJdbcRepositories;
import org.springframework.data.relational.core.mapping.Embedded.Nullable;
@Configuration
@EnableJdbcRepositories
public class AggregateJdbcConfiguration extends AbstractJdbcConfiguration {
@Override
public JdbcCustomConversions jdbcCustomConversions() {
return new JdbcCustomConversions(Arrays.asList(new Converter<Clob, String>() {
@Nullable
@Override
public String convert(Clob clob) {
try {
return Math.toIntExact(clob.length()) == 0 //
? "" //
: clob.getSubString(1, Math.toIntExact(clob.length()));
} catch (SQLException e) {
throw new IllegalStateException("Failed to convert CLOB to String.", e);
}
}
}));
}
}
以下是我最喜欢的一些关于该主题的视频
https://www.youtube.com/watch?v=EaHlancPA14&list=PLsC0nE-wJ1I4ra6KYXTPOXipdrJ_IdhaO&index=3&t=0s
https://www.youtube.com/watch?v=GOSW911Ox6s&list=PLsC0nE-wJ1I4ra6KYXTPOXipdrJ_IdhaO&index=4&t=59s
https://www.youtube.com/watch?v=AnIouYdwxo0&list=PLsC0nE-wJ1I4ra6KYXTPOXipdrJ_IdhaO&index=5&t=2730s
还有几篇博文
https://spring.io/blog/2018/09/24/spring-data-jdbc-references-and-aggregates
https://spring.io/blog/2018/09/17/introducing-spring-data-jdbc