2013-05-10 2 views
1

Я использую JPA/JFreeChart для отображения данных, которые я собирал с помощью микроконтроллера, однако я измеряю 14 датчиков каждые 10 секунд. Я измеряю более 2 месяцев, и у меня более 7000000 наборов данных.JPA Lazy Fetch Custom Query

Теперь, к моей реальной проблеме, так как я не хочу загружать 7000000 строк каждый раз, когда я запускаю свою программу, я хочу использовать только средние значения в минутах/часах. Я подумал об использовании NamedQuery, но я не знаю, как сохранить отношения внутри него и сделать JPA использовать его, так как до сих пор загрузка данных была выполнена самой JPA. Может быть, я могу просто решить это, добавив к этому больше аннотаций?

@OneToMany(mappedBy="sensor") 
@OrderBy("timestamp ASC") 
public List<Value> getValues() { 
    return this.values; 
} 

Заранее благодарен!

С наилучшими пожеланиями

ответ

1

Straight JPA не позволяет результаты фильтрации, так как это означает, что отношения лица больше не отражает именно то, что находится в базе данных, и она должна была бы стандартизировать поведение на то, что делается при добавлении лица к взаимосвязи, которая отсутствует в коллекции, но уже существует в базе данных.

Самый простой способ для этого сопоставления, однако, - отметить атрибут как @Transient. Затем вы можете использовать метод get для считывания значений из базы данных, когда это необходимо, и кэшировать их в сущности, если хотите.

Многие провайдеры позволяют добавлять фильтры запросов, используемых для принести отображений, например EclipseLink позволяет устанавливать @AdditionalCriteria на отображение, как описано здесь: http://wiki.eclipse.org/EclipseLink/Development/AdditionalCriteria Или вы можете изменить отображение непосредственно, как показано здесь: http://wiki.eclipse.org/EclipseLink/Examples/JPA/MappingSelectionCriteria

+0

спасибо , прямо сейчас я пытаюсь запросить .. мой запрос выглядит так: «SELECT v.id, AVG (v.value) как значение, v.timestamp, v.sensor FROM Значение v WHERE v.sensor =: sensor GROUP BY DATE (v.timestamp), MINUTE (v.timestamp) ORDER BY v.timestamp ASC "однако я получаю ошибку кастинга, так как они не являются« реальными »объектами значения, поскольку они находятся в постоянстве – brancz