我有一个spring项目,需要将查询结果集导出到excel工作表中。目前,我正在使用JPA repository
从数据库中获取数据,而我正在使用Apache POI
库从这些数据中准备excel表。
// Get data from DB using jpaRepository
Page<MyPOJO> data = myPOJOJpaRepository.findAll(specifications, pageRequest);
// Prepare Excel Sheet from the data object using POI libraries
现在,问题在于以Java POJO的形式获取数据花费了太多时间(近60秒),并且使用POI库准备excel表格也花费了近60秒。
当我尝试使用结果集(而不是java POJO)导出csv文件时,它的完成时间不到10秒。
ResultSet resultSet = statement.executeQuery("select * from table where some_filters");
File file = writeResultsToCSVFile(resultSet);
我正在使用JPA specifications
在当前体系结构中构建查询。无论如何,有没有要执行的查询,所以我可以直接获取结果集(而不是POJO)并准备csv文件。
// I'm looking for something like follows:
ResultSet resultSet = statement.executeQuery(specifications.getQuery());
File file = writeResultsToCSVFile(resultSet);
反正有实现这样的目标吗?
答案 0 :(得分:1)
这有点棘手,因为您可以像这样获得非标准查询:
select generatedAlias0 from Pets as generatedAlias0 where generatedAlias0.pet_name=:param0
您必须获取查询,然后需要处理诸如请求的字段和绑定的参数之类的东西(管理它们的类型。请注意,在此示例中,我仅管理字符串类型)。
因此,假设您正在使用Hibernate,则可以执行以下操作:
/**
*
*/
public static Specification<Pets> findByCriteria() {
return new Specification<Pets>() {
@Override
public Predicate toPredicate(Root<Pets> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
List<Predicate> predicates = new ArrayList<Predicate>();
// solo attivita attive
predicates.add(cb.equal(root.get("pet_name"), "Chelsea"));
return cb.and(predicates.toArray(new Predicate[]{}));
}
};
}
/**
* TODO MANAGE VARIOUS TYPES
*/
private String createParam(Parameter<?> p, Query<?> q) {
Class<?> clz = p.getParameterType();
if (clz == String.class) {
return "'" + q.getParameterValue(p.getName()) + "'";
}
return "";
}
/**
*
*/
public void getEnterprisesAdmin() {
Specification<Pets> spec = this.findByCriteria();
CriteriaBuilder builder = this.em.getCriteriaBuilder();
CriteriaQuery<Pets> query = builder.createQuery(Pets.class);
Root<Pets> root = query.from(Pets.class);
Predicate predicate = spec.toPredicate(root, query, builder);
query.where(predicate);
TypedQuery<Pets> findAllBooks = em.createQuery(query);
Query<Pets> q = findAllBooks.unwrap(Query.class);
String strQuery = q.getQueryString();
strQuery = Pattern.compile("(.*?)select \\w*").matcher(strQuery).replaceFirst("SELECT *");
Set<Parameter<?>> pList = q.getParameters();
Iterator<Parameter<?>> iter = pList.iterator();
for (int i=0; i<pList.size(); i++) {
Parameter<?> p = iter.next();
strQuery = strQuery.replace(":" + p.getName(), this.createParam(p, q));
}
try {
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mempoi?useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC", "root", "");
Statement stmt = conn.createStatement();
ResultSet resultSet = stmt.executeQuery(strQuery);
resultSet.next();
System.out.println("PET NAME: " + resultSet.getString("pet_name"));
} catch (Exception e) {
e.printStackTrace();
}
}
您为我提供了一个在我的库MemPOI中实现的下一个功能的好主意(设计用于管理像您这样的情况),该功能为Apache POI提供了抽象层。我将直接从Specification