【问题标题】:Creating and querying tables with JPA - How to return multiple rows?使用 JPA 创建和查询表 - 如何返回多行?
【发布时间】:2019-07-24 02:03:57
【问题描述】:

我想用 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"

它将返回一个包含每天“值”平均值的数组(带有日期和传感器名称)。

此时我知道我必须使用@Entity 为 SENSOR 创建一个模型,但是 SENSOR_DATA 呢?

到目前为止,我尝试使用日期、时间和值创建一个简单的模型、存储库和服务,然后对其进行查询,但问题是我只能在一天内获得单行。这样,我将不得不为每一天分别创建很多对象,这是没有意义的。我认为这是因为我使用了@Entity 并添加了 id,但我想不出不同的解决方案。我想要的是创建一个Sensor 对象,然后通过SENSOR_DATA 表进行查询。

堆栈:Spring Boot、Spring Boot Data JPA Starter、Hibernate、MySQL、Lombok,

【问题讨论】:

    标签: java spring-boot jpa spring-data-jpa spring-data


    【解决方案1】:

    我真的不认为你拥有的 sql 会因为 group by 工作。如果我错了,请纠正我。

    如果您使用 Hibernate 和 Spring 数据 jpa。你可以在 hql 中做 new Object。

    如果映射到 SENSOR_DATA 的实体是 sensorDate。

    并且您的传感器对象具有构造函数(double ave、Date date、String 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 关键字时,hibernate 会将 sql 的输出转换为传感器对象并映射到列表中。另外由于你使用的是hibernate,所以最好使用ORM,比较id时,你可以只比较对象,hibernate内部会将hql转换为sql并比较它们的pk。

    我做了很多假设,但你明白了。只要你能得到你想要的值,你就可以做一个新的并将它们传递到你拥有的pojos中。

    【讨论】:

    • 我确信这个 sql 查询在我在 mock db 上尝试过的工作。
    【解决方案2】:

    由于我不知道如何使用 JPA 来实现,我只使用了 Spring JDBC,它工作得很好。我基于此链接的示例实现: Link

    【讨论】:

      猜你喜欢
      • 2017-03-31
      • 2022-06-28
      • 1970-01-01
      • 2021-01-19
      • 1970-01-01
      • 2019-01-09
      • 2020-02-26
      • 2012-04-29
      • 2011-09-02
      相关资源
      最近更新 更多