【问题标题】:Hibernate export to csv休眠导出到 csv
【发布时间】:2015-04-04 06:36:59
【问题描述】:

我想将查询结果导出到 excel 或 csv 文件。 我正在使用休眠支柱。 有没有像'into outfile'这样的查询可以直接将excel导出到指定位置? 在 MySQL 数据库中,'into outfile' 查询工作正常,但在休眠状态下它不起作用。 我尝试使用本机 sql,但它给出了错误“无法执行批量操作查询”,无论如何我无法解决这个问题。 我正在使用 MySQL 数据库。

【问题讨论】:

    标签: mysql hibernate hql export-to-excel export-to-csv


    【解决方案1】:

    如果你正在编写一个 web 应用程序并使用 spring,你可以通过将数据写入输出流来实现

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

    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;
       }
    }
    

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

    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();
       }
    }
    

    将此消息转换器添加到您的应用上下文配置文件中

    <mvc:annotation-driven>
        <mvc:message-converters register-defaults="true">
            <bean class="com.yourpackage.CsvMessageConverter"/>
        </mvc:message-converters>
    </mvc:annotation-driven>
    

    控制器最终看起来像

    @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 RS here 的类似方法。

    但底线是如果您想以正确的方式将数据输入输出流,但如果您唯一的目标是将数据输入到文件,您可以将数据放在列表中,然后简单地将其写入文件。

    【讨论】:

    • 谢谢。我正在使用 struts2,我是通过 FileWriter 完成的。我将查询结果集存储到列表中(转换为 MyPojo)并使用 for 循环将数据写入以逗号分隔的文件。
    猜你喜欢
    • 1970-01-01
    • 2013-01-31
    • 1970-01-01
    • 1970-01-01
    • 2017-07-17
    • 2011-11-12
    • 1970-01-01
    • 2014-05-14
    • 2011-03-24
    相关资源
    最近更新 更多