我有一个查询,在最坏的情况下会创建超过 15 万个实体。可能有 300,000k 个实体的上限。我尝试了几种方法将这组数据返回给用户...我只使用 sql Developer 运行查询,它运行时间约为 0.348 秒。所以这不是任何形式的瓶颈。
我像这样创建一个嵌套查询......
List<Object[]> ObjList = (List<Object[]>) emf.createNativeQuery(assembleNestedQuery(query2)).getResultList();
本机查询是这样组装的......
String query2 = assembleQuery(organizationIDs, 2);
else if (type == 4){
queryBuilder.append("SELECT t0.RESOURCE_ID, t0.FIRST_NAME, t0.MIDDLE_NAME, t0.LAST_NAME FROM EPCD13.Provider t0");
if(typeArgs.length > 0){
queryBuilder.append(" WHERE t0.RESOURCE_ID IN (");
for(int i = 0 ; i <= typeArgs.length - 1; i++){
if(i != typeArgs.length -1)
queryBuilder.append(typeArgs[i] +", ");
else
queryBuilder.append(typeArgs[i] +" ");
if((i % 1000 == 0) && (i != 0)){
queryBuilder.append(") OR IN (");
}
}
queryBuilder.append(")");
}
}
private String assembleNestedQuery(String typeArgs2){
StringBuilder queryBuilder = new StringBuilder();
queryBuilder.append("SELECT t0.RESOURCE_ID, t0.FIRST_NAME, t0.MIDDLE_NAME, t0.LAST_NAME FROM EPCD13.Provider t0");
queryBuilder.append(" WHERE t0.RESOURCE_ID IN (");
queryBuilder.append(typeArgs2);
queryBuilder.append(")");
return queryBuilder.toString();
}
上面的代码基本上组装了这个查询......
SELECT t0.RESOURCE_ID, t0.FIRST_NAME, t0.MIDDLE_NAME, t0.LAST_NAME FROM EPCD13.Provider t0 WHERE t0.RESOURCE_ID IN (SELECT DISTINCT d.RESOURCE_ID FROM EPCD13.RESOURCES d WHERE d.ORGANIZATION_ID in (...))
所以嵌套查询基本上是动态创建的……我运行的查询返回了大约 155K 条记录。现在我基本上运行下面的代码将结果转换为 Provider 对象......
List<Provider> provList = new ArrayList<Provider>();
for(Object[] obj: ObjList)
{
provList.add(this.GetProviderFromObj(obj));
}
这就是发生异常的地方。JPA 处理的数据集是否太大?我可以通过一些简单的 Java JDBC 连接和一些非常简单的基本 Java 对象来做到这一点。但是,这组数据是否太大而无法使用?
谢谢。
更新:我得到的例外
java.lang.OutOfMemoryError: caused by: java.lang.OutOfMemoryError