powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / SQL запрос в HQL/Сriteria
25 сообщений из 75, страница 2 из 3
SQL запрос в HQL/Сriteria
    #37759564
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ccoder, над эти вариантом знающие люди уже поплакали) читай выше)
...
Рейтинг: 0 / 0
SQL запрос в HQL/Сriteria
    #37759577
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ccoder, может проще в 2 отдельных запроса? в первом получаешь дату и подставляешь ее во второй запрос.

Код: java
1.
2.
3.
4.
		Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Patient.class);
		criteria.add(Restrictions.eq("id", Long.valueOf(1)));
		criteria.createCriteria("healths").add(Restrictions.eq("timestamp", сюда));
		
...
Рейтинг: 0 / 0
SQL запрос в HQL/Сriteria
    #37759582
ccoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну уж один раз хочу разобраться со сложным случаем
...
Рейтинг: 0 / 0
SQL запрос в HQL/Сriteria
    #37759601
ccoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот так уже близко, но получаю только один результат (а всего должно быть 4)
Код: java
1.
2.
3.
4.
5.
6.
        DetachedCriteria subquery = DetachedCriteria.forClass(Health.class);
        subquery.setProjection(Projections.max("timestamp"));
        subquery.add(Expression.eqProperty("patient", "patient.id"));

        Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Health.class);
        criteria.add(Restrictions.eq("patient.id", Long.valueOf(1)));
        criteria.add(Subqueries.propertyEq("timestamp", subquery));
...
Рейтинг: 0 / 0
SQL запрос в HQL/Сriteria
    #37759614
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ccoder, Hibernate же пишет в лог запрос SQL и какие данные он подставил. Там не видно почему только 1?
...
Рейтинг: 0 / 0
SQL запрос в HQL/Сriteria
    #37759622
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ccoder, может из-за Long.valueOf(1) ?
...
Рейтинг: 0 / 0
SQL запрос в HQL/Сriteria
    #37759809
ccoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
Subqueries.propertiesEq


авторNote that support for multicolumn subqueries is not implemented until in Hibernate 4.0.0.CR5.
Можно-ли всётаки сделать с criteria query в query?
...
Рейтинг: 0 / 0
SQL запрос в HQL/Сriteria
    #37759838
ccoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так ладно с criteria многого наверно не сделать....

Давайте с HQL,
Помогите тогда с
Код: java
1.
2.
3.
4.
5.
6.
7.
		return (Set<Health>) sessionFactory.getCurrentSession().createQuery(
				"FROM health a "+
			    "JOIN patient b ON a.patientID = b.patientID " +
			    "JOIN Account c ON b.accountID = c.ID " +
			    "WHERE c.Password='password' " +
			    "AND c.Login='login' " +
			    "ORDER BY a.timestamp desc").list();


Для начала хочу просто выбрать все healths.

Получаю
авторorg.hibernate.hql.ast.QuerySyntaxException: unexpected token: ON near line 1, column 30 [FROM health a JOIN patient b ON a.patientID = b.pat
ientID JOIN Account c ON b.accountID = c.ID WHERE c.Password='password' AND c.Login='login' ORDER BY a.timestamp desc]

P.S.
Сами понимаете - сложно
...
Рейтинг: 0 / 0
SQL запрос в HQL/Сriteria
    #37759856
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ccoder, что то не пишет никто( может left join? )
...
Рейтинг: 0 / 0
SQL запрос в HQL/Сriteria
    #37759862
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdm, и опять же как писал Blazkowicz нужно оперировать полями объекта в запросе HQL, а не столбцами таблицы.

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
return (Set<Health>) sessionFactory.getCurrentSession().createQuery(
				"FROM health a "+
			    "JOIN a.patient as b ON a.patientID = b.patientID " +
			    "JOIN b.account c ON b.accountID = c.ID " +
			    "WHERE c.Password='password' " +
			    "AND c.Login='login' " +
			    "ORDER BY a.timestamp desc").list();
...
Рейтинг: 0 / 0
SQL запрос в HQL/Сriteria
    #37759864
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Серьезно мои ответы не воспринимай)
...
Рейтинг: 0 / 0
SQL запрос в HQL/Сriteria
    #37759873
ccoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторorg.hibernate.hql.ast.QuerySyntaxException: unexpected token: ON near line 1, column 36 [FROM patient b LEFT JOIN Account c ON b.accountID =
c.ID WHERE c.Password='password' AND c.Login='login' ]
...
Рейтинг: 0 / 0
SQL запрос в HQL/Сriteria
    #37759875
ccoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотябы пациента по аккаунту как получить?

Код: java
1.
2.
3.
4.
5.
6.
sessionFactory.getCurrentSession().createQuery(
				"FROM patient b "+
				"JOIN Account c ON b.accountID = c.ID " +
			    "WHERE c.Password='password' " +
			    "AND c.Login='login' "
				).list()


авторorg.hibernate.hql.ast.QuerySyntaxException: unexpected token: ON near line 1, column 31 [FROM patient b JOIN Account c ON b.accountID = c.ID
WHERE c.Password='password' AND c.Login='login' ]
...
Рейтинг: 0 / 0
SQL запрос в HQL/Сriteria
    #37759881
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ccoder, вобще параметры в запрос вставляются через setParameter().
Например
Код: java
1.
2.
3.
4.
List<Person> list = sess.createQuery(
    "FROM patient b JOIN Account c ON b.accountID = c.ID WHERE c.Password= :password AND c.Login= :login ")
    .setParameter("password", password).setParameter("login", login).
    .list();  
...
Рейтинг: 0 / 0
SQL запрос в HQL/Сriteria
    #37759894
ccoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А с JOIN что делать?
...
Рейтинг: 0 / 0
SQL запрос в HQL/Сriteria
    #37759915
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ccoder, во-первых вместо "JOIN Account c" как я понимаю надо "b.account as c" соблюдая регистр. При это в классе patient должно быть поле account.
...
Рейтинг: 0 / 0
SQL запрос в HQL/Сriteria
    #37759917
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тебе мне кажется гораздо быстрее и правильнее ответили, если бы ты привел пример классов и как они замаплены в БД
...
Рейтинг: 0 / 0
SQL запрос в HQL/Сriteria
    #37759918
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdmccoder, во-первых вместо "JOIN Account c" как я понимаю надо "left join b.account as c" соблюдая регистр. При это в классе patient должно быть поле account.
...
Рейтинг: 0 / 0
SQL запрос в HQL/Сriteria
    #37759925
ccoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот так получилось
Код: java
1.
2.
3.
4.
5.
		return (Set<Health>) sessionFactory.getCurrentSession().createQuery(
				"FROM Health a "+		    
				"WHERE a.patient.account.login='test@mail.com' " +
			    "AND a.patient.account.password='aaaa' "
			    ).list();


т.е. эта часть работает

Далее пробую
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
		sessionFactory.getCurrentSession().createQuery(
				"FROM Health a "+
				"INNER JOIN "+
						"(SELECT type, MAX(timestamp) AS MaxDateTime FROM a WHERE a.patient.account.login='test@mail.com' " +
					    "AND a.patient.account.password='aaaa' " +
						"BY type) groupedtt " +
					    "ON a.type = groupedtt.type "+
						"AND a.timestamp = groupedtt.MaxDateTime " +			    
				"WHERE a.patient.account.login='test@mail.com' " +
			    "AND a.patient.account.password='aaaa' "
			    ).list()


Получаю
авторorg.hibernate.hql.ast.QuerySyntaxException: unexpected token: ( near line 1, column 53 [FROM lt.webmedia.eHealth.domain.Health a INNER JOIN
(SELECT type, MAX(timestamp) AS MaxDateTime FROM a WHERE AND a.patient.account.login='test@mail.com' AND a.patient.account.password='aaaa'
BY type) groupedttON a.type = groupedtt.type AND a.timestamp = groupedtt.MaxDateTimeWHERE a.patient.account.login='test@mail.com' AND a.pati
ent.account.password='aaaa' ]

Какие части у меня не сосуществуют HQL?
Брал я с рабочего SQL
Код: sql
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



P.S.
Мне нужно выбрать все здоровья пациента с последними датами(по одной на параметр) имея логин и пароль(с account таблицы)
...
Рейтинг: 0 / 0
SQL запрос в HQL/Сriteria
    #37759938
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ccoder, попробуй SELECT type, MAX(timestamp) AS MaxDateTime FROM Health a
...
Рейтинг: 0 / 0
SQL запрос в HQL/Сriteria
    #37759942
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и еще ты order не забыл в подзапросе?
...
Рейтинг: 0 / 0
SQL запрос в HQL/Сriteria
    #37759945
ccoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот так
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
sessionFactory.getCurrentSession().createQuery(
				"FROM Health a "+
				"INNER JOIN "+
						"SELECT type, MAX(timestamp) AS MaxDateTime FROM a WHERE a.patient.account.login='test@mail.com' " +
					    "AND a.patient.account.password='aaaa' " +
						"BY type groupedtt " +
					    "ON a.type = groupedtt.type "+
						"AND a.timestamp = groupedtt.MaxDateTime " +			    
				"WHERE a.patient.account.login='test@mail.com' " +
			    "AND a.patient.account.password='aaaa' "
			    ).list()


авторorg.hibernate.hql.ast.QuerySyntaxException: unexpected token: SELECT near line 1, column 53
...
Рейтинг: 0 / 0
SQL запрос в HQL/Сriteria
    #37759948
ccoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdmи еще ты order не забыл в подзапросе?
Не нужно, так как мне нужны все только последнии параметры одного пациента. Т.е. по одному параметру от каждого типа и чтобы каждый был с последней датой из своей группы (а группируются типу)
...
Рейтинг: 0 / 0
SQL запрос в HQL/Сriteria
    #37759960
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ccoder, эх. Надо чтоб знающий человек ответил)
...
Рейтинг: 0 / 0
SQL запрос в HQL/Сriteria
    #37759966
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ccoderrdmи еще ты order не забыл в подзапросе?
Не нужно, так как мне нужны все только последнии параметры одного пациента. Т.е. по одному параметру от каждого типа и чтобы каждый был с последней датой из своей группы (а группируются типу)
а group не забыл? )
...
Рейтинг: 0 / 0
25 сообщений из 75, страница 2 из 3
Форумы / Java [игнор отключен] [закрыт для гостей] / SQL запрос в HQL/Сriteria
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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