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 объектісінде алынуы керек.
GO TO FULL VERSION