首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hibernate导出到csv

问Hibernate导出到csv
EN

Stack Overflow用户
提问于 2015-04-04 06:36:59
回答 1查看 2.8K关注 0票数 0

我想导出查询结果到excel或csv文件。我正在使用hibernate struts。是否有类似于“into”的查询可以直接将excel导出到指定的位置?在MySQL数据库中,“into”查询工作良好,但在hibernate中却不起作用。我尝试使用本机sql,但它出现了“无法执行批量操作查询”的错误,无论如何,我无法解决这个问题。我正在使用MySQL数据库。

EN

回答 1

Stack Overflow用户

发布于 2015-04-04 09:09:24

如果您正在编写web应用程序并使用spring,则可以通过将数据写入输出流来完成。

编写一个简单的类来构造您的响应

代码语言:javascript
复制
public class CsvResponse {    
   private final String filename;
   private final List<YourPojo> records;

   public CsvResponse(List<YourPojo> records, String filename) {
       this.records = records;
       this.filename = filename;
   }
   public String getFilename() {
       return filename;
   }
   public List<YourPojo> getRecords() {
       return records;
   }
}

现在编写消息转换器将它们写入输出流。

代码语言:javascript
复制
public class CsvMessageConverter extends AbstractHttpMessageConverter<CsvResponse> {
   public static final MediaType MEDIA_TYPE = new MediaType("text", "csv", Charset.forName("UTF-8"));
   public CsvMessageConverter() {
       super(MEDIA_TYPE);
   }

   protected boolean supports(Class<?> clazz) {
       return CsvResponse.class.equals(clazz);
   }

   protected void writeInternal(CsvResponse response, HttpOutputMessage output) throws Exception {
       output.getHeaders().setContentType(MEDIA_TYPE);
       output.getHeaders().set("Content-Disposition", "attachment; filename=\"" + response.getFilename() + "\"");
       OutputStream out = output.getBody();

       CsvWriter writer = new CsvWriter(new OutputStreamWriter(out), '\u0009');
       List<YourPojo> allRecords = response.getRecords();
       for (int i = 1; i < allRecords.size(); i++) {
            YourPojo aReq = allRecords.get(i);
            writer.write(aReq.toString());
       }
       writer.close();
   }
}

将此消息转换器添加到应用程序上下文配置文件中。

代码语言:javascript
复制
<mvc:annotation-driven>
    <mvc:message-converters register-defaults="true">
        <bean class="com.yourpackage.CsvMessageConverter"/>
    </mvc:message-converters>
</mvc:annotation-driven>

最后,控制器看起来就像

代码语言:javascript
复制
@RequestMapping(value = "/csvData", method = RequestMethod.GET, produces="text/csv")
@ResponseBody
public CsvResponse getFullData(HttpSession session) throws IOException {
      // get data
      List<YourPojo> allRecords = yourService.getData();

      return new CsvResponse(allRecords, "yourData.csv");
}

我发现了一种使用JAX 这里的类似方式。

但底线是,如果您想要以适当的方式将数据输入到输出流中,就必须使用REST机制,但是如果您的唯一目标是将数据输入到文件中,您只需将数据放在列表中,然后简单地将其写入文件。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29443524

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档