我使用com.opencsv 4.1,我想将实体类导出到csv文件。 问题是这个实体类扩展了另一个类。因此,当我导出它时,我只获得子类的字段。
以下是我写入csv文件的代码:
List<ActiveSubstance> activeSubstances = getActiveSubstances();
File reportFile = new File( "activeSubstances.csv");
Writer writer = new PrintWriter(reportFile);
StatefulBeanToCsv<ActiveSubstance> beanToCsv = new StatefulBeanToCsvBuilder<ActiveSubstance>(writer)
.withQuotechar(CSVWriter.NO_QUOTE_CHARACTER)
.withSeparator(CSVWriter.DEFAULT_SEPARATOR)
.build();
beanToCsv.write(activeSubstances);
writer.close();
我得到的导出文件包含以下行:
,,false,xx.model.ActiveSubstanceClass@29f9a8b9
我的父班:
@MappedSuperclass
public abstract class AbstractEntity {
@Id
@DiffIgnore
@Column(name = "UUID")
@CsvBindByName(column = "UUID")
@CsvBindByPosition(position = 0)
private String uuid;
@Column(name = "CODE")
@CsvBindByName(column = "CODE")
@CsvBindByPosition(position = 1)
private String code;
public String getUuid() {
return uuid;
}
public void setUuid(String uuid) {
this.uuid = uuid;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
}
我的孩子班:
@Entity
@Table(name = "T_ACTIVE_SUBSTANCE")
public class ActiveSubstance extends AbstractEntity {
@Column(name = "CRITICAL")
@CsvBindByName(column = "CRITICAL")
@CsvBindByPosition(position = 3)
private Boolean critical;
@ManyToOne
@JoinColumn(name = "ACTIVE_SUBSTANCE_CLASS_ID")
@CsvBindByName(column = "ACTIVE_SUBSTANCE_CLASS_ID")
@CsvBindByPosition(position = 4)
private ActiveSubstanceClass activeSubstanceClass;
/**
* Default constructor
*/
public ActiveSubstance() {
}
public Boolean getCritical() {
return critical;
}
public void setCritical(Boolean critical) {
this.critical = critical;
}
public ActiveSubstanceClass getActiveSubstanceClass() {
return activeSubstanceClass;
}
public void setActiveSubstanceClass(ActiveSubstanceClass activeSubstanceClass)
{
this.activeSubstanceClass = activeSubstanceClass;
}
}
为什么父母的属性未导出?我怎么能得到它们? 此外,如何在我的csv文件而不是对象中获取activeSubstanceClass.toString?
如果有人可以提供帮助,我将非常感激。
提前谢谢。
答案 0 :(得分:0)
您是否尝试过保护抽象类中的字段而不是私有字段,以便它们对子类可见?
答案 1 :(得分:0)
我正在使用OpenCSV 3.10。我尝试在具体的父类中使用受保护的字段,简而言之,不会导出继承的字段,详情如下。
父类:
import com.opencsv.bean.CsvBindByPosition;
public class ParentCsv {
@CsvBindByPosition(position = 0)
protected String firstField;
public String getFirstField() {
return firstField;
}
public void setFirstField(String firstField) {
this.firstField = firstField;
}
}
儿童班:
import com.opencsv.bean.CsvBindByPosition;
public class ChildCsv extends ParentCsv {
@CsvBindByPosition(position = 1)
private String secondField;
@CsvBindByPosition(position = 2)
private String thirdField;
public String getSecondField() {
return secondField;
}
public void setSecondField(String secondField) {
this.secondField = secondField;
}
public String getThirdField() {
return thirdField;
}
public void setThirdField(String thirdField) {
this.thirdField = thirdField;
}
}
当我跑步时:
ChildCsv childCsvToExport = new ChildCsv();
childCsvToExport.setFirstField("firstField");
childCsvToExport.setSecondField("secondField");
childCsvToExport.setThirdField("thirdField");
try {
Writer writer = new FileWriter("yourfile.csv");
StatefulBeanToCsv statefulBeanToCsvBuilder = new StatefulBeanToCsvBuilder(writer).withQuotechar(Character.MIN_VALUE).withSeparator('|').build();
statefulBeanToCsvBuilder.write(childCsvToExport);
writer.close();
} catch (IOException e) {
e.printStackTrace();
} catch (CsvRequiredFieldEmptyException e) {
e.printStackTrace();
} catch (CsvDataTypeMismatchException e) {
e.printStackTrace();
}
我获得:
|secondField|thirdField