1.1 Panimula sa HQL

Dati, nakilala mo ang Hibernate, at ngayon ay ipakikilala ko sa iyo ang HQL , aka Hibernate Query Language . Sa katunayan, ito ay SQL na na-convert para sa pagsulat ng mga query sa Hibernate. Mayroon itong ilang pangunahing pagkakaiba.

  1. Gamit ang pangalan ng klase sa halip na pangalan ng talahanayan.
  2. Gamit ang pangalan ng field ng klase sa halip na pangalan ng column ng talahanayan.
  3. Opsyonal na paggamit ng piling.

Hilingin natin sa Hibernate na ibalik sa amin ang lahat ng user na mayroon ito sa database. Narito ang magiging hitsura ng kahilingang iyon:

from User

Iyon lang, para sa paghahambing, nagpapakita kami ng katulad na query sa SQL:

select * from user

Narito Userang pangalan ng klase, at userang pangalan ng talahanayan.

Ang kumpletong Java code ay magiging ganito:


public List<User> getAllUsers() {
    try (Session session = sessionFactory.openSession()) {
            return session.createQuery("from User", User.class).list();
    }
}

Kung hindi, ang HQL ay halos kapareho sa SQL - mayroon din itong mga operator:

  • WHERE
  • ORDER BY
  • GROUP BY
  • HAVING

1.2 Halimbawa ng pagtatrabaho sa HQL

Marahil ang nakaraang halimbawa ay medyo nakakalito dahil sa parehong talahanayan at mga pangalan ng field. Gumawa tayo ng isang espesyal na halimbawa kung saan ito ay magiging mas madali.

Sabihin nating mayroon kaming talahanayan ng user_data na naglalaman ng mga sumusunod na field:

  • id INT
  • username VARCHAR(100)
  • user_level INT
  • user_created DATE

Gagawa kami ng isang klase ng Java na magmamapa sa talahanayang ito:


@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;
}

Ngayon magsulat tayo ng ilang halimbawa:

HQL SQL
mula sa User piliin ang * mula sa user_data
mula sa User kung saan id=3 piliin ang * mula sa user_data kung saan id=3
mula sa User kung saan ang antas sa (10,20,30) piliin ang * mula sa user_data kung saan user_level IN (10, 20, 30)
mula sa pagkakasunud-sunod ng User sa pamamagitan ng ginawang asc piliin ang * mula sa user_data order ng user_created asc
mula sa User kung saan ang pangalan tulad ng 'pagsubok' piliin ang * mula sa user_data kung saan ang user_name tulad ng 'pagsubok'

Ang mga query ay halos magkapareho, at ang pagbabasa ng mga query sa HQL kapag pamilyar ka sa mga pangalan ng klase at ang kanilang mga field ay kasingdali ng pagbabasa ng mga query sa SQL. Maaaring medyo mas mahirap magsulat, ngunit muli, napakasalimuot na mga query ay bihirang nakasulat sa HQL.

1.3 Gamit ang piliin

Sa HQL, maaari mong gamitin selectkapag ang uri ng data ng resulta ay hindi tumutugma sa uri na tinukoy sa from.

Halimbawa, gusto naming makuha ang mga pangalan ng lahat ng user na nasa aming user_data table , pagkatapos ay kailangan naming isulat ang sumusunod na query:

select name from User

Gayundin, kung mayroong mga duplicate sa mga pangalan, maaari mong gamitin ang operator DISTINCT:

select distinct name from User

Ang mga alyas ay gumagana katulad ng sa SQL:

select distinct u.name from User u where u.created > '2020-01-01'

Buweno, ganap sa anyo ng Java code, ang kahilingang ito ay magiging ganito:

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();
    }
}

Tandaan na ang query ay dapat magbalik ng isang listahan ng mga pangalan. Ang mga pangalan ay may uri ng String, kaya ang uri ng function at ang uri ng parameter ng Query class ay may uri ng String.