无法从 Spring-boot SQL 查询中读取结果
Failed to read results from Spring-boot SQL query
我正在尝试使用来自存储库界面的以下查询来读取从数据库中获取的数据:
public interface EventObjectRepository extends CrudRepository<EventObject, Long> {
@Query(value = "select tb.content from table0 tb where tb.id=:id", nativeQuery = true)
List<String> find(@Param("id") Long id);
}
下面是我从这个查询中得到的结果的示例快照,它存储在 java 列表中:List<String> results
[clob1: '{"identity":0,"original_text":"some text","rowid":2}', clob2: '{"identity":2,"original_text":"some text","rowid":3}', clob3: '{"identity":3,"original_text":"some text","rowid":4}', clob4: '{"identity":4,"product.name":"some name","original_text":"some text","commodity.name":"some name","rowid":5}']
但是,当我尝试访问列表的内容时,例如:
results.get(1)
我收到以下错误:
[ERROR] 2018-10-22 13:44:45.113 [http-nio-8090-exec-1] [dispatcherServlet] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.Cla
ssCastException: com.sun.proxy.$Proxy164 cannot be cast to java.lang.String] with root cause
java.lang.ClassCastException: com.sun.proxy.$Proxy164 cannot be cast to java.lang.String
如何正确获取结果字符串?
在将results.get(1)
赋值给String variable
之前,您可以通过results.get(1).getClass()
检查列表中数据的类型,然后尝试将结果赋值给合适的类型。
如果我没记错的话,你正在尝试访问整个列表中的第一个对象,因为你需要将所有数据放入列表中,然后尝试从列表中获取(索引)。
例如:列表listEmp=empRepository.findAll().get
我终于在 CLOB 的帮助下让它工作了。
我做的第一件事是将 class 定义中的 String 更改为 CLOB,如下所示:
@Column(columnDefinition="text")
@Lob
private String content;
通过添加 @Lob,字符串将按照 post 中的建议保存到 DB 中的 CLOB。然后为了检索数据,存储库查询将 return 如下所示的 CLOB 列表:
public interface EventObjectRepository extends CrudRepository<EventObject, Long> {
@Query(value = "select tb.content from table0 tb where tb.id=:id", nativeQuery = true)
List<Clob> find(@Param("id") Long id);
}
将数据放入 CLOB 列表后,我需要使用 InputStream 和 IOUtils 将每个 CLOB 转换为字符串。例如,要从列表中获取一项:
InputStream stream = results.get(1).getAsciiStream();
StringWriter w = new StringWriter();
IOUtils.copy(stream, w);
String sample = w.toString();
我正在尝试使用来自存储库界面的以下查询来读取从数据库中获取的数据:
public interface EventObjectRepository extends CrudRepository<EventObject, Long> {
@Query(value = "select tb.content from table0 tb where tb.id=:id", nativeQuery = true)
List<String> find(@Param("id") Long id);
}
下面是我从这个查询中得到的结果的示例快照,它存储在 java 列表中:List<String> results
[clob1: '{"identity":0,"original_text":"some text","rowid":2}', clob2: '{"identity":2,"original_text":"some text","rowid":3}', clob3: '{"identity":3,"original_text":"some text","rowid":4}', clob4: '{"identity":4,"product.name":"some name","original_text":"some text","commodity.name":"some name","rowid":5}']
但是,当我尝试访问列表的内容时,例如:
results.get(1)
我收到以下错误:
[ERROR] 2018-10-22 13:44:45.113 [http-nio-8090-exec-1] [dispatcherServlet] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.Cla
ssCastException: com.sun.proxy.$Proxy164 cannot be cast to java.lang.String] with root cause
java.lang.ClassCastException: com.sun.proxy.$Proxy164 cannot be cast to java.lang.String
如何正确获取结果字符串?
在将results.get(1)
赋值给String variable
之前,您可以通过results.get(1).getClass()
检查列表中数据的类型,然后尝试将结果赋值给合适的类型。
如果我没记错的话,你正在尝试访问整个列表中的第一个对象,因为你需要将所有数据放入列表中,然后尝试从列表中获取(索引)。
例如:列表listEmp=empRepository.findAll().get
我终于在 CLOB 的帮助下让它工作了。
我做的第一件事是将 class 定义中的 String 更改为 CLOB,如下所示:
@Column(columnDefinition="text")
@Lob
private String content;
通过添加 @Lob,字符串将按照 post
public interface EventObjectRepository extends CrudRepository<EventObject, Long> {
@Query(value = "select tb.content from table0 tb where tb.id=:id", nativeQuery = true)
List<Clob> find(@Param("id") Long id);
}
将数据放入 CLOB 列表后,我需要使用 InputStream 和 IOUtils 将每个 CLOB 转换为字符串。例如,要从列表中获取一项:
InputStream stream = results.get(1).getAsciiStream();
StringWriter w = new StringWriter();
IOUtils.copy(stream, w);
String sample = w.toString();