powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Сложный Hibernate запрос
21 сообщений из 21, страница 1 из 1
Сложный Hibernate запрос
    #37732330
ccoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.
Както затруднительно сделать следующий запрос.

Есть таблица в которой хранятся параметры здоровья пациента.
В ней есть поле тип , значение , дата . (и id )

Нужно выбрать по одной строке на тип с самой последней датой.

Т.е. все последние показатели здоровья.

Вот такой код имею для начала
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
	Set<Health> getLastHealthsByPatient(Patient patient)
	{
		Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Health.class);
		criteria.add(Restrictions.eq("PATIENTID", patient));
		
		DetachedCriteria maxQuery = DetachedCriteria.forClass( Health.class );
		maxQuery.setProjection( Projections.max( "TIMESTAMP" ) );
		criteria.add( Property.forName( "TIMESTAMP" ).eq( maxQuery ) );
		
		
		return (Set<Health>)criteria.list();			
	}	


Но как сделать чтобы от каждого типа?
...
Рейтинг: 0 / 0
Сложный Hibernate запрос
    #37732372
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
group by тип?
...
Рейтинг: 0 / 0
Сложный Hibernate запрос
    #37732454
ccoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну чтобы ещё были все по одному с наибольшими датами в своей группе (по типу)
...
Рейтинг: 0 / 0
Сложный Hibernate запрос
    #37732457
ccoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я на простом SQL тоже как затрудняюсь сказать как это сделать. Ведь нужно не только сделать сделать по одному от группы но и ещё сделать чтобы от группы брался с наибольшей датой...
...
Рейтинг: 0 / 0
Сложный Hibernate запрос
    #37732680
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если изменить саму таблицу? Есть возможноть? Ну то есть либо добавить дополнительную связанную с ней. Для того, чтобы не мучится со сложными запросами через hql.
Я вообще когда подобного рода вещи возникают, то изменяю клиентскую сторону и добавляю или меняю таблички, благо возможность присутствует. А вот у знакомых трогать базу категорически запрещено, вот они там под mssql портянки запросов строчат дай боже.
...
Рейтинг: 0 / 0
Сложный Hibernate запрос
    #37732735
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ccoderЯ на простом SQL тоже как затрудняюсь сказать как это сделать.

как-то так

Код: sql
1.
2.
3.
4.
5.
6.
select * from Table1 t1
where not exists (
  select * from Table1 t2
  where t2.type = t1.type
  and t2.date>t1.date
)
...
Рейтинг: 0 / 0
Сложный Hibernate запрос
    #37733164
ccoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никgroup by тип?
Делаю
Код: sql
1.
SELECT id, value, max(date), type, value FROM health GROUP BY type


получаю
авторORA-00936: missing expression
00936. 00000 - "missing expression"
*Cause:
*Action:
Error at Line: 1 Column: 22
...
Рейтинг: 0 / 0
Сложный Hibernate запрос
    #37733165
ccoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpashaccoderЯ на простом SQL тоже как затрудняюсь сказать как это сделать.

как-то так

Код: sql
1.
2.
3.
4.
5.
6.
select * from Table1 t1
where not exists (
  select * from Table1 t2
  where t2.type = t1.type
  and t2.date>t1.date
)



Делаю
Код: sql
1.
2.
3.
4.
5.
6.
select * from health t1
where not exists (
  select * from health t2
  where t2.type = t1.type
  and t2.date>t1.date
)


получаю
авторORA-01747: invalid user.table.column, table.column, or column specification
01747. 00000 - "invalid user.table.column, table.column, or column specification"
*Cause:
*Action:
Error at Line: 5 Column: 9
...
Рейтинг: 0 / 0
Сложный Hibernate запрос
    #37733169
ccoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблица
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
  CREATE TABLE "HEALTH" 
   (	"ID" NUMBER, 
	"TYPE" VARCHAR2(20 BYTE), 
	"VALUE" FLOAT(126), 
	"TIMESTAMP" TIMESTAMP (6), 
	"PATIENTID" NUMBER
   );
Insert into HEALTH (ID,TYPE,VALUE,TIMESTAMP,PATIENTID) values ('0','weight','85,6',to_timestamp('2012.03.31 10:00:00,000000000','RRRR.MM.DD HH24:MI:SS,FF'),'0');
Insert into HEALTH (ID,TYPE,VALUE,TIMESTAMP,PATIENTID) values ('1','height','186',to_timestamp('2012.03.31 00:00:00,000000000','RRRR.MM.DD HH24:MI:SS,FF'),'0');
Insert into HEALTH (ID,TYPE,VALUE,TIMESTAMP,PATIENTID) values ('2','SBP','120',to_timestamp('2012.03.31 00:00:00,000000000','RRRR.MM.DD HH24:MI:SS,FF'),'0');
Insert into HEALTH (ID,TYPE,VALUE,TIMESTAMP,PATIENTID) values ('3','DBP','80',to_timestamp('2012.03.31 00:00:00,000000000','RRRR.MM.DD HH24:MI:SS,FF'),'0');
Insert into HEALTH (ID,TYPE,VALUE,TIMESTAMP,PATIENTID) values ('4','weight','85,1',to_timestamp('2012.03.31 20:00:00,000000000','RRRR.MM.DD HH24:MI:SS,FF'),'0');
Insert into HEALTH (ID,TYPE,VALUE,TIMESTAMP,PATIENTID) values ('5','weight','87,1',to_timestamp('2012.04.01 12:00:00,000000000','RRRR.MM.DD HH24:MI:SS,FF'),'0');
Insert into HEALTH (ID,TYPE,VALUE,TIMESTAMP,PATIENTID) values ('6','weight','87,1',to_timestamp('2012.04.01 12:00:00,000000000','RRRR.MM.DD HH24:MI:SS,FF'),'1');
...
Рейтинг: 0 / 0
Сложный Hibernate запрос
    #37733199
ccoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Делаю
Код: sql
1.
2.
3.
4.
5.
6.
select * from health t1
where not exists (
  select * from health t2
  where t2.type = t1.type
  and t2.timestamp>t1.timestamp
)


получаю
автор6 weight 87,1 2012.04.01 12:00:00,000000000 1
5 weight 87,1 2012.04.01 12:00:00,000000000 0
3 DBP 80 2012.03.31 00:00:00,000000000 0
1 height 186 2012.03.31 00:00:00,000000000 0
2 SBP 120 2012.03.31 00:00:00,000000000 0
т.е. не отсеянный
...
Рейтинг: 0 / 0
Сложный Hibernate запрос
    #37733200
ccoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Делаю
Код: sql
1.
SELECT id, type, value, timestamp, patientid FROM health WHERE timestamp=(SELECT max(timestamp) FROM health) GROUP BY type


получаю
авторORA-00979: not a GROUP BY expression
00979. 00000 - "not a GROUP BY expression"
*Cause:
*Action:
Error at Line: 1 Column: 7
...
Рейтинг: 0 / 0
Сложный Hibernate запрос
    #37733217
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 01.04.2012 01:20, ccoder wrote:

> получаю

> ORA-00979: not a GROUP BY expression

Если есть возможность сделать именно SQL-запросом к Oracle, то посмотри в сторону аналитических функций, типа
row_number(). И, конечно, обзывать поле зарезервированным именем TIMESTAMP на мой взгляд плохая идея.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Сложный Hibernate запрос
    #37733219
ccoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А в hibernate насчет этого ничего не предусмотрено?
...
Рейтинг: 0 / 0
Сложный Hibernate запрос
    #37733223
ccoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пробую
Код: sql
1.
2.
3.
4.
select id, timestamp, type
from health 
group by type 
having timestamp = max(timestamp)


получаю
авторORA-00979: not a GROUP BY expression
00979. 00000 - "not a GROUP BY expression"
*Cause:
*Action:
Error at Line: 4 Column: 7
...
Рейтинг: 0 / 0
Сложный Hibernate запрос
    #37733230
ccoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пробую
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT *
FROM health
INNER JOIN 
(SELECT type, MAX(timestamp) as TopDate
FROM health
GROUP BY type) AS EachItem ON 
    EachItem.TopDate = Table.timestamp 
    AND EachItem.type = Table.type


получаю
авторORA-00905: missing keyword
00905. 00000 - "missing keyword"
*Cause:
*Action:
Error at Line: 6 Column: 15
...
Рейтинг: 0 / 0
Сложный Hibernate запрос
    #37733236
ccoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Странно, но так
Код: sql
1.
2.
3.
4.
5.
6.
SELECT
  id,
  type,
  MAX(timestamp) AS "MostRecentServiceMonth"
FROM health
GROUP BY id, type


получаю
авторID TYPE MostRecentServiceMonth
-- -------------------- ------------------------------
0 weight 2012.03.31 10:00:00,000000000
1 height 2012.03.31 00:00:00,000000000
6 weight 2012.04.01 12:00:00,000000000
4 weight 2012.03.31 20:00:00,000000000
3 DBP 2012.03.31 00:00:00,000000000
2 SBP 2012.03.31 00:00:00,000000000
5 weight 2012.04.01 12:00:00,000000000

7 rows selected
...
Рейтинг: 0 / 0
Сложный Hibernate запрос
    #37733254
IDVsbruck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно попробовать на HQL:

Код: plsql
1.
FROM Health health WHERE health.patient.id = :patientId AND health.timestamp IN (SELECT MAX(heal.timestamp) FROM Health heal WHERE heal.patient.id = :patientId GROUP BY heal.type)



Но логично предположить, что чем больше timestamp, тем больше id. Поэтому можно оптимизировать запрос, заменив timestamp на id. Но это только в случае, если нет записей "задним числом".

P.S. Рекордов с ID=0 не должно существовать. Нумерация начинается с 1.
...
Рейтинг: 0 / 0
Сложный Hibernate запрос
    #37733258
ccoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IDVsbruckP.S. Рекордов с ID=0 не должно существовать. Нумерация начинается с 1.
Я чтото незнал про это ничего. Можно ещё несколько слов, откуда это?
...
Рейтинг: 0 / 0
Сложный Hibernate запрос
    #37733260
ccoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И пробую сделать на SQL
Код: sql
1.
2.
select * from health
where type and timestamp in (SELECT type, max(timestamp) FROM health GROUP BY type)


получаю
авторORA-00920: invalid relational operator
00920. 00000 - "invalid relational operator"
*Cause:
*Action:
Error at Line: 2 Column: 11
...
Рейтинг: 0 / 0
Сложный Hibernate запрос
    #37733274
ccoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот такой вышел код
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT h.*
FROM health h
INNER JOIN
    (
    SELECT type, MAX(timestamp) AS MaxDateTime
    FROM health
    GROUP BY type
    ) groupedtt ON h.type = groupedtt.type AND h.timestamp = groupedtt.MaxDateTime AND patientid=0



Теперь вопрос - как это дело лучше оформить на HQL или ещё бы лучше с Criteria?
...
Рейтинг: 0 / 0
Сложный Hibernate запрос
    #37733470
IDVsbruck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ccoderIDVsbruckP.S. Рекордов с ID=0 не должно существовать. Нумерация начинается с 1.
Я чтото незнал про это ничего. Можно ещё несколько слов, откуда это?
Банальное наблюдение.
Работая с клиентом на флексе, когда на клиенте создается новый объект, передается на сервер, сериализуется и я хочу записать его в базу, то вижу, что тот же клиент не передает null в поле id, там стоит 0. Соответственно, имей я рекорд с id=0, все новые записывались поверх него. Но хибер записывает строку в конец таблицы. Соответственно делаю вывод, что я не должен делать рекорд с id=0. Второе наблюдение касалось работы с DWR- та же ситуация. Третье - если я создаю новую таблицу и записываю первый рекорд, то у него первый рекорд имеет id=1. С чего бы это? Любые коллекции имеют первый порядковый номер 0, а тут 1.

Подтверждения своим словам я не нахожу, поэтому не могу настаивать на своей точке зрения.


Что касается приведенного кода, то я его не тут писал, а тестировал на реальной базе. И у меня работало. Только таблица другая: id совпадает, вместо patientid у меня orderid, timestamp остался, вместо type у меня statusid, значение можно брать любое поле. Для определенного ордера (всего для него было 27 рекордов, 3 разных статуса и разные таймстампы) мой запрос выдал 3 рекорда (по количеству статусов), у которых максимальные таймстампы в своих группах по статусам.
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Сложный Hibernate запрос
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]