powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / SQL запрос в HQL/Сriteria
25 сообщений из 75, страница 1 из 3
SQL запрос в HQL/Сriteria
    #37758789
ccoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть таблицы
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
SQL запрос в HQL/Сriteria
    #37758822
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ccoderОчень хочу чтобы ктонибудь мне помог сделать HQL/Сriteria

Ну, так конвертируйте ваш SQL в свойства и сущности. Если что не получится - спрашивайте.
...
Рейтинг: 0 / 0
SQL запрос в HQL/Сriteria
    #37758970
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ccoderС SQL достаточно трудно,
сильно усложняет запросы модель EAV (сущность\атрибут\значение).
Т.е. запись всех разнообразных параметров пациента через универсальные 2 поля TYPE \ VALUE.
В общем случае лучше каждый параметр именовать отдельно и иметь свою собственную размерность.
Но могут быть варианты (форум проектир.БД).
- аккаунт можно занести в Пациент.. и искать по логину\имени\возрасту\адресу. Но не по паролю.
...
Рейтинг: 0 / 0
SQL запрос в HQL/Сriteria
    #37758982
ccoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пробую как тут 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
SQL запрос в HQL/Сriteria
    #37759066
ccoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мда, завяз наверно на долго......
...
Рейтинг: 0 / 0
SQL запрос в HQL/Сriteria
    #37759194
ccoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите где именно ошибка
Вот так пробую только с 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
SQL запрос в HQL/Сriteria
    #37759244
ccoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А так
Код: 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
SQL запрос в HQL/Сriteria
    #37759258
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В HQL и Criteria API используются имена Свойств и Сущностей, а не Таблиц и Колонок. Будьте внимательны в этом вопросе.
...
Рейтинг: 0 / 0
SQL запрос в HQL/Сriteria
    #37759262
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
new Long(1) это новый экземпляр на каждый вызов. Long.valueOf или автобоксинг - 1l
...
Рейтинг: 0 / 0
SQL запрос в HQL/Сriteria
    #37759268
ccoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. А регистр не имеет значения?
2. Чем толком отличается eqProperty от eq?
...
Рейтинг: 0 / 0
SQL запрос в HQL/Сriteria
    #37759270
ccoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczВ HQL и Criteria API используются имена Свойств и Сущностей, а не Таблиц и Колонок. Будьте внимательны в этом вопросе.
Проверил, но вроде тоже самое, за исключением регистра
...
Рейтинг: 0 / 0
SQL запрос в HQL/Сriteria
    #37759271
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ccoder1. А регистр не имеет значения?
имеет

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

+1
Критерии имеет смысл юзать только если запрос нужно в рантайме строить.
...
Рейтинг: 0 / 0
SQL запрос в HQL/Сriteria
    #37759318
ccoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я всётаки хочу сделать с критериями
...
Рейтинг: 0 / 0
SQL запрос в HQL/Сriteria
    #37759466
ccoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
SQL запрос в HQL/Сriteria
    #37759492
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ccoder, может обернуть sub в new Date() ?
...
Рейтинг: 0 / 0
SQL запрос в HQL/Сriteria
    #37759506
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ccoderjava.lang.ClassCastException: java.lang.String cannot be cast to java.util.Date
уже просто зеленею
A stacktrace?

А почему 2 раза
add(Subqueries.eq("timestamp", subquery));
...
Рейтинг: 0 / 0
SQL запрос в HQL/Сriteria
    #37759511
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdmccoder, может обернуть sub в new Date() ?
Кого обернуть?
...
Рейтинг: 0 / 0
SQL запрос в HQL/Сriteria
    #37759512
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
timestamp не совсем удачное имя для колонки. Это же тип данных.
...
Рейтинг: 0 / 0
SQL запрос в HQL/Сriteria
    #37759528
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
SQL запрос в HQL/Сriteria
    #37759531
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdmcriteria.add(Subqueries.eq("timestamp", DateFormat.parse(subquery))
Плачу. Этот код собирает запрос, а не работает во время обработки данных запроса.
...
Рейтинг: 0 / 0
SQL запрос в HQL/Сriteria
    #37759535
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz, точно) попытка не пытка)
...
Рейтинг: 0 / 0
SQL запрос в HQL/Сriteria
    #37759550
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz, и как же тогда привести тип с подзапросе?
...
Рейтинг: 0 / 0
SQL запрос в HQL/Сriteria
    #37759555
ccoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
25 сообщений из 75, страница 1 из 3
Форумы / Java [игнор отключен] [закрыт для гостей] / SQL запрос в HQL/Сriteria
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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