Большая оболочка OpenJPA query.getResutList (), чтобы избежать List <MyObject>, а затем выполнить итерацию - PullRequest
0 голосов
/ 11 октября 2018

Версия openjpa-2.4.1=2.4.1.SNAPSHOT

У меня есть сложный sql, запущенный как собственный запрос в OpenJPA.Некоторая фильтрация значений выполняется на стороне приложения при циклическом просмотре массива.

Это означает, что List<MyObject> сохраняется в памяти до того, как какие-либо строки будут записаны в выходной поток сервлета.Не говоря уже о том, что набор данных MySQL jdbc полностью читается в ОЗУ из-за того, как работает драйвер mysql jdbc.Таким образом, строки хранятся в ОЗУ два раза за некоторый период времени.

Можно ли при вызове функции 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 (), ссылка Iэто здесь для дальнейшего использования, если у OpenJPA есть однажды.Также ссылка на билет OpenJPA 3.x.https://www.thoughts -on-java.org / JPA-2-2S-новый поток-метод-и-как-вы-должны-не-потребительный он / https://issues.apache.org/jira/browse/OPENJPA-2711

...