Java-使用超级CSV导出到CSV,带有属性的实体

Java-使用超级CSV导出到CSV,带有属性的实体,java,export-to-csv,supercsv,Java,Export To Csv,Supercsv,我需要帮助将简单的查询结果转换为CSV文件,我在数据库中查询与另一个实体有连接关系的Car实体: public class Car { private Integer id; private String desc; private Tyres tyres; //getters and setters; } public class Tyres { private Integer id; private String model; //getters and setters } 我

我需要帮助将简单的查询结果转换为CSV文件,我在数据库中查询与另一个实体有连接关系的Car实体:

public class Car {

private Integer id;
private String desc;
private Tyres tyres;

//getters and setters;

}

public class Tyres {

private Integer id;
private String model;

//getters and setters
}
我设法很好地获得了该车型的id和desc属性,但我一辈子都无法理解如何使用Super CSV获得轮胎模型:

        response.setContentType("text/csv");
        DateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss");
        String currentDateTime = dateFormatter.format(new Date());
         
        String headerKey = "Content-Disposition";
        String headerValue = "attachment; filename=cars_" + currentDateTime + ".csv";
        response.setHeader(headerKey, headerValue);
        //result of the query here: 
        List<Car> listCars = service.listAll();
 
        ICsvBeanWriter csvWriter = new CsvBeanWriter(response.getWriter(), CsvPreference.STANDARD_PREFERENCE);
        String[] csvHeader = {"ID", "DESC", "Tyre Model"};
        String[] nameMapping = {"id", "desc", ???};
         
        csvWriter.writeHeader(csvHeader);
         
        for (Car car : listCars) {
            csvWriter.write(car, nameMapping);
        }
         
        csvWriter.close();
response.setContentType(“text/csv”);
DateFormat dateFormatter=新的SimpleDateFormat(“yyyy-MM-dd_HH-MM-ss”);
字符串currentDateTime=dateFormatter.format(新日期());
字符串headerKey=“内容处置”;
字符串headerValue=“附件;文件名=cars_quot+currentDateTime+”.csv”;
response.setHeader(headerKey,headerValue);
//查询结果如下:
List listCars=service.listAll();
ICsvBeanWriter csvWriter=新的CsvBeanWriter(response.getWriter(),CsvPreference.STANDARD_首选项);
字符串[]csvHeader={“ID”、“DESC”、“轮胎型号”};
字符串[]nameMapping={“id”,“desc”,???};
csvWriter.writeHeader(csvHeader);
用于(汽车:列表汽车){
csvWriter.write(car,nameMapping);
}
csvWriter.close();
如果我在nameMapping中写入tires.model,则会导致一个错误,表明它找不到此属性。
我阅读了Super CSV文档中的所有文档,但仍然不清楚。

要使用嵌套属性,您使用了正确的语法(
“tyres.model”
)-但您需要将它与SuperCSV一起使用

如果您使用的是Maven,则可以使用以下依赖项将此扩展添加到项目中:

<dependency>
    <groupId>net.sf.supercsv</groupId>
    <artifactId>super-csv-dozer</artifactId>
    <version>2.4.0</version>
</dependency>
一些基本测试数据:

轮胎=新轮胎();
轮胎。setId(9123);
轮胎。setModel(“米其林”);
Car car1=新车();
car1.setId(101);
car1.setDesc(“蓝色汽车”);
car1.设置轮胎(轮胎);
Car car2=新车();
car2.setId(202);
car2.setDesc(“红色汽车”);
car2.设置轮胎(轮胎);
最终列表cars=Arrays.asList(car1,car2);
正在生成文件:

(在我的例子中,我只是提供了一个在我的文件系统上生成文件的示例。在您的例子中,看起来您是在发送数据作为对HTTP请求的响应。在这两种情况下,使用SuperCSV和Dozer读取嵌套字段的方法是相同的。)

try(ICsvDozerBeanWriter beanWriter=new CsvDozerBeanWriter(
新文件编写器(“writeWithCsvBeanWriter.csv”,StandardCharsets.UTF_8),
CSVP参考。标准(优先){
字符串[]csvHeader={“ID”、“DESC”、“轮胎型号”};
String[]fieldMappings={“id”,“desc”,“tyres.model”};
beanWriter.configureBeanMapping(Car.class,fieldMappings);
beanWriter.writeHeader(csvHeader);
用于(汽车:汽车){
beanWriter.write(car);
}
}
我正在使用推土机扩展bean writer
CsvDozerBeanWriter
和映射字段值:
“id”、“desc”、“tires.model”

这将生成以下输出文件:

ID,DESC,Tyre Model
101,A blue car,Michelin
202,A red car,Michelin

请注意,我正在确保使用UTF-8编码
StandardCharsets.UTF_8
编写文件。我使用的语句确保在处理结束时自动关闭资源,因此我不需要
csvWriter.close()

此问题中的代码似乎有一些输入错误。例如,您有一个名为
Car
的类,但您也参考了
List
。还有
listCars
listCars
。你能再检查一下你给我们看的代码是否有效吗?