Создание и запрос таблиц с помощью JPA - Как вернуть несколько строк? - PullRequest
0 голосов
/ 02 марта 2019

Я хотел бы создать такие таблицы в MySQL с помощью Hibernate / JPA.

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"

Он будет возвращать массив средних значений 'value' за каждый день (с датой и имя_сенсора).

На данный момент я знаю, что мне нужно создать модель для SENSOR с @Entity, но как насчет SENSOR_DATA?

До сих пор я пытался создать простую модель, хранилище и сервис с датой, временем и значением изатем запросить его, но проблема заключалась в том, что я смог получить только одну строку за один день.Таким образом, мне пришлось бы создавать множество объектов для каждого дня отдельно, что не имеет смысла.Я предполагаю, что это было из-за того, что я использовал @Entity и добавил id, но я не мог найти другое решение.Я хочу создать один объект Sensor и затем выполнить запрос через таблицу SENSOR_DATA.

Стек: Spring Boot, Spring Boot Data JPA Starter, Hibernate, MySQL, Lombok,

Ответы [ 2 ]

0 голосов
/ 02 марта 2019

Поскольку я не мог понять, как это сделать с помощью JPA, я просто использовал Spring JDBC, и он прекрасно работает.Я основал пример реализации по этой ссылке: Ссылка

0 голосов
/ 02 марта 2019

Я действительно не думаю, что sql у вас будет работать из-за группы.Поправьте меня, если я ошибаюсь.

Если вы используете Hibernate и Spring data jpa.Вы можете создать новый объект в hql.

Скажите, если сущность, сопоставленная с 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);

Позвольте мне объяснить:

когда новое ключевое слово, hibernate преобразует выходные данные sql и сопоставляется с объектом датчика и в список.Также, поскольку вы используете hibernate, лучше использовать ORM, когда сравниваете id, вы можете просто сравнить объект, внутренне hibernate преобразует hql в sql и сравнит их pk.

Я делаю много предположений, но вы поняли идею.До тех пор, пока вы можете получить желаемое значение, вы можете создать новое и передать их в ваши pojos.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...