为了账号安全,请及时绑定邮箱和手机立即绑定

无法从 Spring-boot SQL 查询中读取结果

无法从 Spring-boot SQL 查询中读取结果

白衣非少年 2021-12-01 15:40:43
我正在尝试使用来自存储库界面的以下查询读取从数据库中获取的数据: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.ClassCastException: com.sun.proxy.$Proxy164 cannot be cast to java.lang.String] with root causejava.lang.ClassCastException: com.sun.proxy.$Proxy164 cannot be cast to java.lang.String我应该怎么做才能得到结果字符串?
查看完整描述

3 回答

?
慕田峪9158850

TA贡献1794条经验 获得超7个赞

如果我没有错,您正试图访问整个列表中的第一个对象,因为您需要将所有数据放入列表,然后尝试从列表中获取(索引)。

例如:列表 listEmp=empRepository.findAll().get


查看完整回答
反对 回复 2021-12-01
?
小唯快跑啊

TA贡献1863条经验 获得超2个赞

在分配results.get(1)给之前String variable,您可以检查列表中数据的类型,results.get(1).getClass()然后尝试将结果分配给适当的类型。


查看完整回答
反对 回复 2021-12-01
?
拉丁的传说

TA贡献1789条经验 获得超8个赞

我终于在 CLOB 的帮助下让它工作了。


我做的第一件事是在类定义中将 String 更改为 CLOB,如下所示:


@Column(columnDefinition="text")

@Lob

private String content;

通过添加@Lob,字符串将按照此处的帖子中的建议保存到 DB 内的 CLOB 。然后为了检索数据,存储库查询将返回一个 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();


查看完整回答
反对 回复 2021-12-01
  • 3 回答
  • 0 关注
  • 293 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信