Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / SQL запрос в HQL/Сriteria / 25 сообщений из 75, страница 1 из 3
18.04.2012, 12:09:37
    #37758789
ccoder
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос в HQL/Сriteria
Есть таблицы
http://img713.imageshack.us/img713/2690/hhhhsm.png
смысл их в том что у пациента есть парамерты здоровья с датами занесения: вес, рост и т.д. и у каждого пациент есть аккаунт. (аккаунт<->пациент один к одному)

Нужно имея только login и password достать все последнии параметры здоровья у пациента.

С SQL достаточно трудно, мне получилось сделать абы как и то только если есть id пациента
Код: plsql
1.
SELECT h.* FROM health h INNER JOIN (SELECT type, MAX(timestamp) AS MaxDateTime FROM health WHERE patientid=0 GROUP BY type) groupedtt ON h.type = groupedtt.type AND h.timestamp = groupedtt.MaxDateTime AND patientid=0



Очень хочу чтобы ктонибудь мне помог сделать HQL/Сriteria

P.S.
Если нужно, выложу код с тестовыми данными
...
Рейтинг: 0 / 0
18.04.2012, 12:21:20
    #37758822
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос в HQL/Сriteria
ccoderОчень хочу чтобы ктонибудь мне помог сделать HQL/Сriteria

Ну, так конвертируйте ваш SQL в свойства и сущности. Если что не получится - спрашивайте.
...
Рейтинг: 0 / 0
18.04.2012, 13:21:53
    #37758970
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос в HQL/Сriteria
ccoderС SQL достаточно трудно,
сильно усложняет запросы модель EAV (сущность\атрибут\значение).
Т.е. запись всех разнообразных параметров пациента через универсальные 2 поля TYPE \ VALUE.
В общем случае лучше каждый параметр именовать отдельно и иметь свою собственную размерность.
Но могут быть варианты (форум проектир.БД).
- аккаунт можно занести в Пациент.. и искать по логину\имени\возрасту\адресу. Но не по паролю.
...
Рейтинг: 0 / 0
18.04.2012, 13:27:14
    #37758982
ccoder
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос в HQL/Сriteria
Пробую как тут https://forum.hibernate.org/viewtopic.php?p=2317841
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Example ex = Example.create(user);

DetachedCriteria subquery = DetachedCriteria.forClass(Position.class, "last_pos");
subquery.setProjection(Projections.max("last_pos.date"));
subquery.add(Expression.eqProperty("last_pos.userId", "u.id"));

Criteria crit = session.createCriteria(Agent.class, "a")
crit.add(ex);               
crit.createCriteria("positions", "pos");
crit.add(Subqueries.propertyEq("pos.date", subquery));
crit.add(Expression.eq("pos.status", userStatus));

return crit.list();



Делаю
Код: java
1.
2.
3.
4.
5.
		Example ex = Example.create(account);

		DetachedCriteria subquery = DetachedCriteria.forClass(Health.class, "last_date");
		subquery.setProjection(Projections.max("last_date.TIMESTAMP"));
		subquery.add(Expression.eqProperty("last_date.PATIENTID", "patient.id"));


а что дальше?
...
Рейтинг: 0 / 0
18.04.2012, 14:08:14
    #37759066
ccoder
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос в HQL/Сriteria
Мда, завяз наверно на долго......
...
Рейтинг: 0 / 0
18.04.2012, 15:01:31
    #37759194
ccoder
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос в HQL/Сriteria
Подскажите где именно ошибка
Вот так пробую только с patient и health (без account).
Т.е. получить все последнии параметры здоровья у пациента который имеет id=1
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
		DetachedCriteria subquery = DetachedCriteria.forClass(Health.class, "last_date");
		subquery.setProjection(Projections.max("last_date.TIMESTAMP"));
		subquery.add(Expression.eq("last_date.PATIENTID", "patient.id"));

		Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Patient.class);
		criteria.add(Restrictions.eq("id", new Long(1)));
		criteria.createCriteria("healths", "health");
		criteria.add(Subqueries.eq("health.TIMESTAMP", subquery));

                (Set<Health>) criteria.list();


получаю
авторorg.hibernate.MappingException: Unknown entity: null
...
Рейтинг: 0 / 0
18.04.2012, 15:22:57
    #37759244
ccoder
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос в HQL/Сriteria
А так
Код: java
1.
2.
3.
4.
5.
6.
7.
		DetachedCriteria subquery = DetachedCriteria.forClass(Health.class);
		subquery.setProjection(Projections.max("TIMESTAMP"));
		subquery.add(Expression.eqProperty("PATIENTID", "patient.id"));

		Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Patient.class);
		criteria.add(Restrictions.eq("id", new Long(1)));
		criteria.createCriteria("healths").add(Subqueries.eq("TIMESTAMP", subquery));


авторorg.hibernate.QueryException: could not resolve property: TIMESTAMP
...
Рейтинг: 0 / 0
18.04.2012, 15:29:31
    #37759258
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос в HQL/Сriteria
В HQL и Criteria API используются имена Свойств и Сущностей, а не Таблиц и Колонок. Будьте внимательны в этом вопросе.
...
Рейтинг: 0 / 0
18.04.2012, 15:30:46
    #37759262
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос в HQL/Сriteria
new Long(1) это новый экземпляр на каждый вызов. Long.valueOf или автобоксинг - 1l
...
Рейтинг: 0 / 0
18.04.2012, 15:32:47
    #37759268
ccoder
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос в HQL/Сriteria
1. А регистр не имеет значения?
2. Чем толком отличается eqProperty от eq?
...
Рейтинг: 0 / 0
18.04.2012, 15:34:11
    #37759270
ccoder
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос в HQL/Сriteria
BlazkowiczВ HQL и Criteria API используются имена Свойств и Сущностей, а не Таблиц и Колонок. Будьте внимательны в этом вопросе.
Проверил, но вроде тоже самое, за исключением регистра
...
Рейтинг: 0 / 0
18.04.2012, 15:36:09
    #37759271
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос в HQL/Сriteria
ccoder1. А регистр не имеет значения?
имеет

ccoder2. Чем толком отличается eqProperty от eq?
Expression, вроде, deprecated уже. JavaDoc пробовали читать.
eqProperty(propertyName, anotherPropertyName) - сравнивает зачения 2х свойств
eq(propertyName, value) - сравнивает свойство с конкретным значением
...
Рейтинг: 0 / 0
18.04.2012, 15:48:44
    #37759296
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос в HQL/Сriteria
Чем вас sql ваш не устраивает? С критериями столько возни что проще заюзать hibernate-transformer - http://www.codereye.com/2010/01/using-hibernate-transformers.html

Кстати вот ваш запрос(добавил вытягивание patientId по login)

Код: plsql
1.
SELECT h.* FROM health h INNER JOIN (SELECT type, MAX(timestamp) AS MaxDateTime FROM health WHERE patientid=(select p.id from PATIENT p join ACCOUNT ac on p.accountid = ac.id where ac.login='login') GROUP BY type) groupedtt ON h.type = groupedtt.type AND h.timestamp = groupedtt.MaxDateTime AND patientid=(select p.id from PATIENT p join ACCOUNT ac on p.accountid = ac.id where ac.login='login')
...
Рейтинг: 0 / 0
18.04.2012, 15:54:54
    #37759309
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос в HQL/Сriteria
забыл никЧем вас sql ваш не устраивает? С критериями столько возни что проще заюзать hibernate-transformer - http://www.codereye.com/2010/01/using-hibernate-transformers.html

+1
Критерии имеет смысл юзать только если запрос нужно в рантайме строить.
...
Рейтинг: 0 / 0
18.04.2012, 15:57:42
    #37759318
ccoder
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос в HQL/Сriteria
Я всётаки хочу сделать с критериями
...
Рейтинг: 0 / 0
18.04.2012, 16:53:22
    #37759466
ccoder
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос в HQL/Сriteria
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
		DetachedCriteria subquery = DetachedCriteria.forClass(Health.class);
		subquery.setProjection(Projections.max("timestamp"));
		subquery.add(Expression.eqProperty("patient", "patient.id"));

		Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Patient.class);
		criteria.add(Restrictions.eq("id", Long.valueOf(1)));
		criteria.createCriteria("healths").add(Subqueries.eq("timestamp", subquery));
		criteria.add(Subqueries.eq("timestamp", subquery));

return (Set<Health>) criteria.list();


java.lang.ClassCastException: java.lang.String cannot be cast to java.util.Date
уже просто зеленею
...
Рейтинг: 0 / 0
18.04.2012, 17:03:47
    #37759492
rdm
rdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос в HQL/Сriteria
ccoder, может обернуть sub в new Date() ?
...
Рейтинг: 0 / 0
18.04.2012, 17:07:31
    #37759506
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос в HQL/Сriteria
ccoderjava.lang.ClassCastException: java.lang.String cannot be cast to java.util.Date
уже просто зеленею
A stacktrace?

А почему 2 раза
add(Subqueries.eq("timestamp", subquery));
...
Рейтинг: 0 / 0
18.04.2012, 17:08:27
    #37759511
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос в HQL/Сriteria
rdmccoder, может обернуть sub в new Date() ?
Кого обернуть?
...
Рейтинг: 0 / 0
18.04.2012, 17:08:57
    #37759512
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос в HQL/Сriteria
timestamp не совсем удачное имя для колонки. Это же тип данных.
...
Рейтинг: 0 / 0
18.04.2012, 17:13:09
    #37759528
rdm
rdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос в HQL/Сriteria
Blazkowicz, я предположил относительно java.lang.ClassCastException: java.lang.String cannot be cast to java.util.Date )
Что то типа такого или Calendar )

criteria.add(Subqueries.eq("timestamp", DateFormat.parse(subquery))
...
Рейтинг: 0 / 0
18.04.2012, 17:14:47
    #37759531
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос в HQL/Сriteria
rdmcriteria.add(Subqueries.eq("timestamp", DateFormat.parse(subquery))
Плачу. Этот код собирает запрос, а не работает во время обработки данных запроса.
...
Рейтинг: 0 / 0
18.04.2012, 17:16:21
    #37759535
rdm
rdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос в HQL/Сriteria
Blazkowicz, точно) попытка не пытка)
...
Рейтинг: 0 / 0
18.04.2012, 17:22:14
    #37759550
rdm
rdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос в HQL/Сriteria
Blazkowicz, и как же тогда привести тип с подзапросе?
...
Рейтинг: 0 / 0
18.04.2012, 17:22:34
    #37759555
ccoder
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос в HQL/Сriteria
rdmccoder, может обернуть sub в new Date() ?
Код: java
1.
criteria.createCriteria("healths").add(Subqueries.eq("timestamp", new Date(subquery));


пишет
авторThe method eq(Object, DetachedCriteria) in the type Subqueries is not applicable for the arguments (String, Date)
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / SQL запрос в HQL/Сriteria / 25 сообщений из 75, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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