1.1 HQL அறிமுகம்

முன்பு, நீங்கள் Hibernate உடன் பழகியுள்ளீர்கள், இப்போது நான் உங்களுக்கு HQL க்கு அறிமுகப்படுத்துகிறேன் , aka Hibernate Query Language . உண்மையில், இது ஹைபர்னேட்டில் வினவல்களை எழுதுவதற்காக மாற்றப்பட்ட SQL ஆகும். இது பல முக்கிய வேறுபாடுகளைக் கொண்டுள்ளது.

  1. அட்டவணைப் பெயருக்குப் பதிலாக வகுப்பின் பெயரைப் பயன்படுத்துதல் .
  2. அட்டவணை நெடுவரிசைப் பெயருக்குப் பதிலாக வகுப்பு புலத்தின் பெயரைப் பயன்படுத்துதல் .
  3. தேர்ந்தெடுக்கப்பட்ட விருப்பத்தின் பயன்பாடு.

தரவுத்தளத்தில் உள்ள அனைத்து பயனர்களையும் எங்களிடம் திருப்பித் தருமாறு Hibernate ஐக் கேட்போம். அந்த கோரிக்கை எப்படி இருக்கும் என்பது இங்கே:

from User

அவ்வளவுதான், ஒப்பிடுவதற்கு, SQL இல் இதே போன்ற வினவலை முன்வைக்கிறோம்:

select * from user

இங்கே Userவகுப்பின் பெயர், மற்றும் userஅட்டவணையின் பெயர்.

முழுமையான ஜாவா குறியீடு இப்படி இருக்கும்:


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 உடன் பணிபுரிவதற்கான எடுத்துக்காட்டு

அதே அட்டவணை மற்றும் புலப் பெயர்கள் காரணமாக முந்தைய உதாரணம் சற்று குழப்பமாக இருக்கலாம். இது எளிதாக இருக்கும் ஒரு சிறப்பு உதாரணத்துடன் வருவோம்.

பின்வரும் புலங்களைக் கொண்ட பயனர்_தரவு அட்டவணை எங்களிடம் உள்ளது என்று வைத்துக் கொள்வோம் :

  • ஐடி INT
  • பயனர் பெயர் VARCHAR(100)
  • பயனர்_நிலை INT
  • பயனர்_உருவாக்கியது DATE

இந்த அட்டவணையை வரைபடமாக்கும் ஜாவா வகுப்பை உருவாக்குவோம்:


@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
பயனரிடமிருந்து பயனர்_தரவிலிருந்து * என்பதைத் தேர்ந்தெடுக்கவும்
ஐடி=3 என்ற பயனரிடமிருந்து ஐடி=3 என்ற இடத்தில் user_data இலிருந்து * என்பதைத் தேர்ந்தெடுக்கவும்
(10,20,30) நிலை இருக்கும் பயனரிடமிருந்து பயனர்_தரவில் இருந்து * என்பதைத் தேர்ந்தெடுக்கவும், அங்கு user_level IN (10, 20, 30)
உருவாக்கப்பட்ட asc மூலம் பயனர் வரிசையிலிருந்து user_created asc மூலம் user_data வரிசையிலிருந்து * என்பதைத் தேர்ந்தெடுக்கவும்
'சோதனை' போன்ற பெயர் இருக்கும் பயனரிடமிருந்து 'சோதனை' போன்ற பயனர்_பெயர் இருக்கும் பயனர்_தரவிலிருந்து * என்பதைத் தேர்ந்தெடுக்கவும்

வினவல்கள் மிகவும் ஒத்தவை, மேலும் வகுப்புப் பெயர்கள் மற்றும் அவற்றின் புலங்கள் உங்களுக்குத் தெரிந்திருக்கும்போது HQL வினவல்களைப் படிப்பது SQL வினவல்களைப் படிப்பது போலவே எளிதானது. எழுதுவது இன்னும் கொஞ்சம் கடினமாக இருக்கலாம், ஆனால் மீண்டும், மிகவும் சிக்கலான வினவல்கள் HQL இல் அரிதாகவே எழுதப்படுகின்றன.

1.3 தேர்ந்தெடு பயன்படுத்துதல்

selectHQL இல், முடிவுகளின் தரவு வகை, இல் குறிப்பிடப்பட்டுள்ள வகையுடன் பொருந்தாதபோது நீங்கள் பயன்படுத்தலாம் from.

எடுத்துக்காட்டாக, எங்கள் பயனர்_தரவு அட்டவணையில் உள்ள அனைத்து பயனர்களின் பெயர்களையும் பெற விரும்புகிறோம் , பிறகு பின்வரும் வினவலை எழுத வேண்டும்:

select name from User

மேலும், பெயர்களில் நகல் இருந்தால், நீங்கள் ஆபரேட்டரைப் பயன்படுத்தலாம் DISTINCT:

select distinct name from User

மாற்றுப்பெயர்கள் SQL இல் உள்ளதைப் போலவே செயல்படுகின்றன:

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

சரி, முற்றிலும் ஜாவா குறியீட்டின் வடிவத்தில், இந்த கோரிக்கை இப்படி இருக்கும்:

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

வினவல் பெயர்களின் பட்டியலை வழங்க வேண்டும் என்பதை நினைவில் கொள்க. பெயர்கள் சரம் வகையாகும், எனவே செயல்பாட்டின் வகை மற்றும் வினவல் வகுப்பின் வகை அளவுரு இரண்டும் சரம் வகையாகும்.