large openjpa query.getresutlist() Package 器,以避免列表< myobject>然后迭代

rjzwgtxy  于 2021-06-18  发布在  Mysql
关注(0)|答案(0)|浏览(155)

版本 openjpa-2.4.1=2.4.1.SNAPSHOT 我在openjpa中有一个作为本机查询运行的复杂sql。当在arraylist中循环时,一些值过滤是在应用程序端完成的。
这意味着 List<MyObject> 在将任何行写入servlet输出流之前保存在内存中。更不用说mysql jdbc resultset是完全读取到ram的,因为mysql jdbc驱动程序是如何工作的。所以行在ram中被保存两次。
在调用 query.getResultList() 功能?我只能将有意义的jdbc行写入json响应,而忽略那些不感兴趣的行。
或者有没有一种方法可以在应用程序端使用原始jdbc结果集并将行强制转换为myobject jpa对象示例?它确实需要托管示例,但希望重用从sql到对象的现有序列化。
当前代码

Query query = em.createNativeQuery(sql, MyObject.class);
query.setParameter(1, "serverX");
List<MyObject> list=query.getResultList();

JsonGenerator jsonG = MyApplication.createJsonGenerator(providers, os);
jsonG.writeStartObject();
jsonG.writeFieldName("items");
jsonG.writeStartArray();
for(MyObject obj : list) {
  if (obj.getType()==1) MyObject.writeJSONv1(jsong, obj);
  else if (obj.getType()==2) MyObject.writeJSONv2(jsong, obj);
  else if (obj.isValid() && obj.getType()==3) MyObject.writeJSONv3(jsong, obj);
  else if (obj.getName().startsWith("abc")) MyObject.writeJSONvX(jsong, obj);
  else Logger.log("Skipped " + obj.getId());
}
jsonG.writeEndArray();
jsonG.writeEndObject();
jsonG.flush();
jsonG.close();

伪代码,渐进迭代器

Query query = em.createNativeQuery(sql, MyObject.class);
query.setParameter(1, "serverX");
Iterator iter=query.getCustomProgressiveRowIterator();

JsonGenerator jsonG = MyApplication.createJsonGenerator(providers, os);
jsonG.writeStartObject();
jsonG.writeFieldName("items");
jsonG.writeStartArray();
for(iter.hasNext()) {
  MyObject obj = (MyObject)iter.next();
  if (obj.getType()==1) MyObject.writeJSONv1(jsong, obj);
  else if (obj.getType()==2) MyObject.writeJSONv2(jsong, obj);
  else if (obj.isValid() && obj.getType()==3) MyObject.writeJSONv3(jsong, obj);
  else if (obj.getName().startsWith("abc")) MyObject.writeJSONvX(jsong, obj);
  else Logger.log("Skipped " + obj.getId());
}
jsonG.writeEndArray();
jsonG.writeEndObject();
jsonG.flush();
jsonG.close();

伪代码,将jdbc行强制转换为对象

PreparedStatement stmt = con.prepareStatement("Select * my complex query From MyObjects");
  ResultSet rs = stmt.executeQuery();
  while(rs.next()) {
    // check few resultset fields, if all good then get MyObject
    MyObject obj = OpenJPA.castResultSetToObject(rs);
    MyObject.writeJSON(jsong, obj);
  }
  rs.close();
  stmt.close();

编辑:@gimby对getresultstream()有一个评论,如果openjpa有这个评论的话,我会把它链接到这里供以后参考。同时链接到openjpa3.x票证。
https://www.thoughts-on-java.org/jpa-2-2s-new-stream-method-and-how-you-should-not-use-it/
https://issues.apache.org/jira/browse/openjpa-2711

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题