我想用Hibernate / JPA在MySQL中创建这样的表。
SENSOR: PK_SENSOR_ID, SENSOR_NAME, SENSOR_URL
SENSOR_DATA: FK_SENSOR_ID, DATE, TIME, VALUE
SENSOR_DATA将包含来自多个传感器的读数。然后我想有一个使用此查询的方法:
"SELECT AVG(VALUE), DATE, SENSOR_NAME, FROM SENSOR, SENSOR_DATA WHERE DATE BETWEEN '2019-03-01' AND '2019-03-02' AND SENSOR_ID = FK_SENSOR_ID GROUP BY DATE"
它将每天返回一个包含“值”平均值的数组(带有日期和sensor_name)。
此刻,我知道我必须使用@Entity为SENSOR创建模型,但是SENSOR_DATA呢?
到目前为止,我尝试创建带有日期,时间和值的简单模型,存储库和服务,然后对其进行查询,但问题是 我一天只能获得一排。这样,我将不得不创建很多 每天分别放置对象,这毫无意义。我认为这是因为我使用了 @Entity并添加了ID,但我找不到其他解决方案。我想要的是创建一个 传感器对象,然后通过SENSOR_DATA表进行查询。
堆栈:Spring Boot,Spring Boot Data JPA Starter,Hibernate,MySQL,Lombok,
答案 0 :(得分:0)
我真的不认为由于group by,您拥有的sql不会工作。如果我错了请纠正我。
如果使用Hibernate和Spring数据jpa。您可以在hql中创建新对象。
说是否映射到SENSOR_DATA的实体是sensorDate。
您的传感器对象具有构造函数(double ave,日期日期,字符串sensorName)
示例:
@Query("select new path/to/Sensor(avg, date, sensorName)
from sensorDate sd
where sd.date <:fromDate and sd.date > :toDate and sd=:fksd)")
public list<Sensor> findSensor(@Param("fromDate")Date fromDate, @Param("toDate")Date toDate, @Param("fksd")SensorDate fksd);
让我解释一下:
当使用new关键字时,休眠将转换sql的输出并映射到传感器对象并进入列表。另外,由于您使用的是hibernate,因此最好使用ORM,当比较id时,您可以只比较对象,内部的hibernate会将hql转换为sql并比较其pk。
我做了很多假设,但您明白了。只要您可以获得想要的价值,就可以做一个新的并将其传递到您拥有的pojo中。
答案 1 :(得分:0)
由于我不知道如何使用JPA进行操作,因此我只使用了Spring JDBC,它的效果很好。我基于此链接的示例实现: Link