1.1 Въведение в HQL
По-рано се запознахте с Hibernate, а сега ще ви запозная с HQL , известен още като Hibernate Query Language . Всъщност това е SQL, преобразуван за писане на заявки в Hibernate. Има няколко основни разлики.
- Използване на името на класа instead of името на tableта.
- Използване на името на полето на класа instead of името на колоната на tableта.
- Незадължително използване на select.
Нека помолим Hibernate да ни върне всички потребители, които има в базата данни. Ето How ще изглежда това искане:
from User
Това е всичко, за сравнение представяме подобна заявка в SQL:
select * from user
Ето User
името на класа и user
името на tableта.
Пълният Java code ще изглежда така:
public List<User> getAllUsers() {
try (Session session = sessionFactory.openSession()) {
return session.createQuery("from User", User.class).list();
}
}
В противен случай HQL е много подобен на SQL - той също има оператори:
WHERE
ORDER BY
GROUP BY
HAVING
1.2 Пример за работа с HQL
Може би предишният пример е малко объркващ поради същите имена на таблици и полета. Нека измислим специален пример, където това би било по-лесно.
Да кажем, че имаме table user_data , която съдържа следните полета:
- id INT
- потребителско име VARCHAR(100)
- потребителско_ниво INT
- user_created ДАТА
Ще създадем Java клас, който ще се преобразува в тази table:
@Entity
@Table(name="user_data")
class User {
@Id
@GeneratedValue
public Integer id;
@Column(name="user_name")
public String name;
@Column(name="user_level")
public Integer level;
@Column(name="user_created")
public Date created;
}
Сега нека напишем няколко примера:
HQL | SQL |
---|---|
от потребителя | изберете * от user_data |
от потребител, където id=3 | изберете * от user_data, където id=3 |
от потребител, където ниво в (10,20,30) | изберете * от user_data, където user_level IN (10, 20, 30) |
от Потребителска поръчка по създаден възр | изберете * от user_data ред по user_created asc |
от потребител, където име като "тест" | изберете * от потребителски_данни, където потребителско_име като "тест" |
Заявките са много сходни и четенето на HQL заявки, когато сте запознати с имената на класовете и техните полета, е също толкова лесно, колкото четенето на SQL заявки. Може да е малко по-трудно за писане, но от друга страна много сложни заявки рядко се пишат на HQL.
1.3 Използване на select
В HQL можете да използвате, select
когато типът данни на резултата не съвпада с типа, посочен в from
.
Например, искаме да получим имената на всички потребители, които са в нашата table user_data , тогава трябва да напишем следната заявка:
select name from User
Също така, ако има дубликати сред имената, тогава можете да използвате оператора DISTINCT
:
select distinct name from User
Псевдонимите работят по същия начин като в SQL:
select distinct u.name from User u where u.created > '2020-01-01'
Е, изцяло под формата на Java code, тази заявка ще изглежда така:
public List<String> getUserNames() {
try (Session session = sessionFactory.openSession()) {
String hql = "select distinct u.name from User u where u.created > '2020-01-01'";
Query<String> query = session.createQuery(hql , String.class);
return query.list();
}
}
Имайте предвид, че заявката трябва да върне списък с имена. Имената са от тип String, така че Howто типът на функцията, така и параметърът на типа на класа Query са от тип String.
GO TO FULL VERSION