I have three tables each having the same coloumns. One of them has the original measured data, the other ones have the data aggregated to minutes and hours. When loading the data in JPA I want to have the same entity/class for every set of data. I tried it with inheritance/mappedsuperclass but it has not worked out so far (not sure if I am doing it right either). I am either getting that there is not a fitting constructor or that the Table is not Mapped. When I set the Table of my Value entity to one of the tables it works for that table however I want to be able to load data from all tables at runtime.
from PersistenceManager.java
@SuppressWarnings("unchecked")
public List<Value> getValues(Sensor sensor) throws Exception {
String query = "SELECT v FROM ValueByHour v WHERE v.sensor = :sensor ORDER BY v.timestamp ASC";
List<Value> list = em.createQuery(query, Value.class).setParameter("sensor", sensor).getResultList();
return list;
}
Value.java
package de.mediacoding.smarthome.entities;
import java.io.Serializable;
import javax.persistence.*;
import java.sql.Timestamp;
/**
* The persistent class for the Value database table.
*
*/
@Entity
@Table(name="Value")
public class Value implements Serializable {
private static final long serialVersionUID = -7514236041356226101L;
private int id;
private Timestamp timestamp;
private double value;
private Sensor sensor;
public Value() {
}
public Value(int id, Timestamp timestamp, double value, Sensor sensor) {
this.id = id;
this.timestamp = timestamp;
this.value = value;
this.sensor = sensor;
}
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(unique=true, nullable=false)
public int getId() {
return this.id;
}
public void setId(int id) {
this.id = id;
}
@Column(nullable=false)
public Timestamp getTimestamp() {
return this.timestamp;
}
public void setTimestamp(Timestamp timestamp) {
this.timestamp = timestamp;
}
@Column(nullable=false)
public double getValue() {
return this.value;
}
public void setValue(double value) {
this.value = this.sensor.getRealValue(value);;
}
//bi-directional many-to-one association to Sensor
@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name="sensor_id", nullable=false)
public Sensor getSensor() {
return this.sensor;
}
public void setSensor(Sensor sensor) {
this.sensor = sensor;
}
}
Stack Trace
Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: ValueByHour is not mapped [SELECT v FROM ValueByHour v WHERE v.sensor = :sensor ORDER BY v.timestamp ASC]
at org.hibernate.hql.internal.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:180)
at org.hibernate.hql.internal.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:110)
at org.hibernate.hql.internal.ast.tree.FromClause.addFromElement(FromClause.java:93)
at org.hibernate.hql.internal.ast.HqlSqlWalker.createFromElement(HqlSqlWalker.java:324)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElement(HqlSqlBaseWalker.java:3291)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElementList(HqlSqlBaseWalker.java:3180)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromClause(HqlSqlBaseWalker.java:706)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:562)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:299)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:247)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:248)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:183)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:105)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:80)
at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:168)
at org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:221)
at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:199)
at org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1735)
at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:301)
... 36 more
if it helps, here is the whole project http://crafthost.de/src.zip
Hope you can understand what I am trying to do.