2013-05-10 59 views
1

我正在使用JPA/JFreeChart來顯示我用微控制器收集的數據,但是,我每10秒就測量14個傳感器。我已經測量了2個多月,並且擁有700多萬套數據。JPA懶惰取自定義查詢

現在我的實際問題,因爲我不想每次啓動我的程序時加載7000000行,我只想使用分鐘/小時的平均值。我曾經想過使用NamedQuery,但是我不知道如何保持其中的關係,並使JPA使用它,因爲直到現在,數據的加載已經由JPA自己完成了。也許我可以通過添加更多註釋來解決這個問題?

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

在此先感謝!

問候

回答

1

直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)as value,v.timestamp,v.sensor FROM Value v WHERE v.sensor =:sensor GROUP BY DATE(v.timestamp),MINUTE(v.timestamp)ORDER BY v.timestamp ASC「但是我得到一個轉換錯誤,因爲它們不是」真正「的值對象,因爲它們在持久化 – brancz 2013-05-11 09:56:50