Criteria API

All lectures for KK purposes
Деңгей , Сабақ
Қол жетімді

Criteria API-мен танысу

Hibernate-де базаға сұраныс жазудың екі жолы бар:

  • Hibernate Query Language
  • Criteria API

Birinshisimen ererede tanysqan bolsang, endi Criteria API-мен танысатын уақыт келді. Өте қуатты құрал, бір мезетте ол HQL-ден де танымал болды. Қазір ол соншалықты танымал емес, бірақ кейбір міндеттер үшін ол HQL-ден жақсы шешім болады.

Қалайда Hibernate-ді оқып, Criteria API-мен танысудан аулақ болуға болмайды. Кішкене мысал жазып көрейік, содан кейін оны талқылаймыз. Мысалы, дерекқордан барлық қызметкерлерді (Employee) сұратайық. Міне, не шығады:


CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<Employee> critQuery = builder.createQuery(Employee.class);
 
Root<Employee> root = critQuery.from(Employee.class);
critQuery.select(root);
 
Query<Employee> query = session.createQuery(critQuery);
List<Employee> results = query.getResultList();

Сложновато көрінеді. Салыстыру үшін сол сұранысты HQL-мен жазайық:


String hqlQuery = "from Employee";
 
Query<Employee> query = session.createQuery(hqlQuery);
List<Employee> results = query.getResultList();

Екі мысалдан алынған соңғы екі жолдар бірдей екенін байқаңыз: біз Query объектісін құрып, оның көмегімен List аламыз. Бұл бізге басқа жолдар да бірдей нәрсе жасайтынын айтуға меңзейді.

Алғашқы мысалдың 3 және 4 жолдарына назар аударыңыз:


Root<Employee> root = critQuery.from(Employee.class);
critQuery.select(root);

Оларды бір жолға жазайық:


critQuery.select(critQuery.from(Employee.class));

Ештеңе есіңе түспеді ме? Ал егер басқаша түспесек:


critQuery.select(critQuery.from(Employee.class));

Иә, бұл SELECT FROM сұранысын құрудың айласы.

Criteria API көмегімен жұмыс істеу мысалдары

Түсінікті болу үшін бірнеше мысал келтіремін.

Сұраныс 1. Жалақысы 10 мыңнан асатын барлық қызметкерлерді алу:


critQuery.select(critQuery.from(Employee.class)).where(builder.gt(root.get("salary"), 10000));

Сұраныс 2. Жалақысы 50 мыңнан кем барлық қызметкерлерді алу:


critQuery.select(critQuery.from(Employee.class)).where(builder.lt(root.get("salary"), 50000));

Сұраныс 3. Лауазымында "тест" сөзі бар барлық қызметкерлерді алу:


critQuery.select(critQuery.from(Employee.class)).where(builder.like(root.get("occupation"), "%тест%"));

Сұраныс 4. 10 мен 50 мың арасында жалақысы бар барлық қызметкерлерді алу:


critQuery.select(critQuery.from(Employee.class)).where(builder.between(root.get("salary"), 10000, 50000));

Сұраныс 5. Аты null-ге тең барлық қызметкерлерді алу:


critQuery.select(critQuery.from(Employee.class)).where(builder.isNull(root.get("name")));

Сұраныс 6. Аты null-ге тең емес барлық қызметкерлерді алу:


critQuery.select(critQuery.from(Employee.class)).where(builder.isNotNull(root.get("name")));

Бұл сұранысты құрудың айласы:

  • Алдымен CriteriaBuilder объектісін аласыз.
  • Одан кейін оның көмегімен CriteriaQuery объектісін жасайсыз.
  • Одан кейін оған CriteriaQuery және CriteriaBuilder көмегімен бөліктер қосасыз.

Осылайша параметрлерді анықтауға болады:

  • SELECT
  • FROM
  • WHERE

Сондай-ақ CriteriaBuilder көмегімен WHERE үшін түрлі шарттарды құра аласыз.

Criteria API көмегін қолдану жолдары

Criteria API көмегімен кез келген күрделі сұранысты құрастыруға болады. Бұл керемет хабар. Мысалы, WHERE үшін күрделі шарт жазғыңыз келсе. Міне, қалай жасауға болады:


Predicate greaterThan = builder.gt(root.get("salary"), 1000);
Predicate testers = builder.like(root.get("occupation"), "тест%");
 
critQuery.select(critQuery.from(Employee.class)).where(builder.or(greaterThan, testers));

Егер OR орнына AND жазғыңыз келсе, соңғы жолды ғана ауыстыру керек:


critQuery.select(critQuery.from(Employee.class)).where(builder.and(greaterThan, testers));

Барлығы өте оңай. Жақсырақ түсіну үшін бірнеше салыстыруларды кесте арқылы келтірейін:

SQL Мәлімет Толық жазба
a < b lt(a, b) builder.lt(a, b)
a > b gt(a, b) builder.gt(a, b)
a OR b or(a, b) builder.or(a, b)
a AND b and(a, b) builder.and(a, b)
a LIKE b like(a, b) builder.like(a, b)
a BETWEEN (c, d) between(a, c, d) builder.between(a, c, d)
a IS NULL isNull(a) builder.isNull(a)
a IS NOT NULL isNotNull(a) builder.isNotNull(a)

Барлығы оңай, солай емес пе?

Сұранысқа сұрыптауды қалай қосамыз? Өте оңай:


critQuery.select( critQuery.from(Employee.class) );
critQuery.where( builder.and(greaterThan, testers) );
critQuery.orderBy( builder.asc(root.get("salary"), builder.desc(root.get("joinDate") )

Сіз CrteriaQuery объектісінің orderBy() әдісін шақырып, оған қажетті параметрлерді бересіз.

Осы сұранысты HQL-де қалай жазылғанын көріңіз. Салыстырыңыз:

select * from Employee where (…) and (…) order by 'salary' asc, 'joinDate' desc

Үш нәрсені есте сақтау керек:

  • SELECT, FROM, WHERE сияқты негізгі операторлар CriteriaQuery объектісінде шақырылуы керек.
  • AND, OR, DESC сияқты қосымша операторлар CriteriaBuilder объектісінде шақырылуы керек.
  • Өріс атаулары get() арқылы Root объектісінде алынуы керек.
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION