1.1 Въведение в HQL

По-рано се запознахте с Hibernate, а сега ще ви запозная с HQL , известен още като Hibernate Query Language . Всъщност това е SQL, преобразуван за писане на заявки в Hibernate. Има няколко основни разлики.

  1. Използване на името на класа instead of името на tableта.
  2. Използване на името на полето на класа instead of името на колоната на tableта.
  3. Незадължително използване на 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.