Criteria API - een voorbeeld van IN-expressies

1. Overzicht

We komen vaak problemen tegen waarbij we entiteiten moeten opvragen op basis van het feit of een kenmerk met één waarde lid is van een bepaalde verzameling.

In deze tutorial leren we hoe we dit probleem kunnen oplossen met behulp van de Criteria API.

2. Voorbeeldentiteiten

Laten we, voordat we beginnen, eens kijken naar de entiteiten die we in ons artikel gaan gebruiken.

We hebben een DeptMedewerker klasse die een veel-op-een relatie heeft met een afdeling klasse:

@Entity openbare klasse DeptEmployee {@Id @GeneratedValue (strategy = GenerationType.SEQUENCE) lange privé-id; private String-titel; @ManyToOne privéafdeling; }

Ook de afdeling entiteit die is toegewezen aan meerdere DeptMedewerkers:

@Entity public class Department {@Id @GeneratedValue (strategy = GenerationType.SEQUENCE) privé lang ID; private String naam; @OneToMany (mappedBy = "department") privé Lijst medewerkers; }

3. Het CriteriaBuilder.In

Laten we eerst de CriteriaBuilder koppel. De in() methode accepteert een Uitdrukking en retourneert een nieuw Predikaat van de CriteriaBuilder.In type. Het kan worden gebruikt om te testen of de gegeven uitdrukking voorkomt in de lijst met waarden:

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

4. Het Expression.In

Als alternatief kunnen we een set overbelast gebruiken in() methoden uit de Uitdrukking koppel:

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

In tegenstelling tot de CriteriaBuilder.in(), de Expression.in () accepteert een verzameling waarden. Zoals we kunnen zien, vereenvoudigt het ook onze code een beetje.

5. IN Expressies met behulp van subquery's

Tot nu toe hebben we verzamelingen met vooraf gedefinieerde waarden gebruikt. Laten we nu eens kijken naar een voorbeeld waarin een verzameling is afgeleid van een uitvoer van een subquery.

We kunnen bijvoorbeeld alles ophalen DeptMedewerkers die behoren tot een Afdeling, met het opgegeven trefwoord in hun naam:

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

Hier hebben we een subquery gemaakt die vervolgens is doorgegeven aan het waarde() als uitdrukking om te zoeken naar de afdeling entiteit.

6. Conclusie

In dit korte artikel hebben we verschillende manieren geleerd om de IN-bewerking te bereiken met behulp van de Criteria API. We hebben ook onderzocht hoe u de Criteria API met subquery's kunt gebruiken.

Ten slotte is de volledige implementatie voor deze tutorial beschikbaar op GitHub.