0

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.

brancz
  • 451
  • 5
  • 15
  • If you want us to tell us what's wrong with your code, show us your code, and the stack trace of the exception you get. – JB Nizet May 11 '13 at 16:33
  • hope that's enough now ;) – brancz May 11 '13 at 17:56
  • 1
    ValueByHour is typo? should be Value probably – JIV May 11 '13 at 18:43
  • No, that's where I wanted to show my "attempt" .. I have 3 Tables that have the same structure .. Value, ValueByMinute, ValueByHour .. Value has the original data that was measured and the others contain the data aggregatet to minutes/hours – brancz May 11 '13 at 20:18
  • 1
    Ok so I solved it by creating an abstract class for all values then created for each type of value a class inheriting from it. Then I was able to load data into the same list from all tables. – brancz May 13 '13 at 07:12
  • @brancz - great solution, post the code if you can -- better, answer your own question for other explorers who find this question. – David H Jan 03 '22 at 19:10

0 Answers0