API за критерии - Пример за IN изрази

1. Общ преглед

Често срещаме проблеми, при които трябва да запитваме обекти въз основа на това дали еднозначен атрибут е член на дадена колекция.

В този урок ще научим как да решим този проблем с помощта на API за критерии .

2. Примерни обекти

Преди да започнем, нека да разгледаме обектите, които ще използваме в нашия запис.

Имаме клас DeptE Employee, който има много-към-едно отношение с клас на отдел :

@Entity public class DeptEmployee { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE) private long id; private String title; @ManyToOne private Department department; }

Също така субектът на отдела , който се съпоставя с множество служители на отдел :

@Entity public class Department { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE) private long id; private String name; @OneToMany(mappedBy="department") private List employees; }

3. CriteriaBuilder.In

На първо място, нека използваме интерфейса CriteriaBuilder . В в () метод приема на експресия и връща нов Предикатна на CriteriaBuilder.In тип . Може да се използва за тестване дали даден израз се съдържа в списъка със стойности:

CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(DeptEmployee.class); Root root = criteriaQuery.from(DeptEmployee.class); In inClause = criteriaBuilder.in(root.get("title")); for (String title : titles) { inClause.value(title); } criteriaQuery.select(root).where(inClause);

4. Изразът.В

Като алтернатива можем да използваме набор от претоварени in () методи от интерфейса Expression :

criteriaQuery.select(root) .where(root.get("title") .in(titles));

За разлика от CriteriaBuilder. в () , Expression.in () приема колекция от стойности. Както виждаме, това също опростява малко нашия код.

5. IN изрази, използващи подзаявки

Досега използвахме колекции с предварително дефинирани стойности. Сега, нека да разгледаме един пример, когато колекция е получена от изход на подзаявка.

Например можем да извлечем всички DeptEfficiee , които принадлежат към отдел, с посочената ключова дума в тяхното име:

Subquery subquery = criteriaQuery.subquery(Department.class); Root dept = subquery.from(Department.class); subquery.select(dept) .distinct(true) .where(criteriaBuilder.like(dept.get("name"), "%" + searchKey + "%")); criteriaQuery.select(emp) .where(criteriaBuilder.in(emp.get("department")).value(subquery));

Тук създадохме подзаявка, която след това беше предадена в стойността () като израз за търсене на субекта на отдела .

6. Заключение

В тази бърза статия научихме различни начини за постигане на операция IN, използвайки API за критерии. Също така проучихме как да използваме API за критерии с подзаявки.

И накрая, пълното внедряване на този урок е достъпно на GitHub.