Criteria API - Et eksempel på IN-udtryk

1. Oversigt

Vi støder ofte på problemer, hvor vi har brug for at forespørge enheder baseret på, om en attribut med en enkelt værdi er medlem af en given samling.

I denne vejledning lærer vi, hvordan du løser dette problem ved hjælp af Kriterier API.

2. Prøveenheder

Lad os tage et kig på de enheder, vi skal bruge i vores opskrivning, inden vi starter.

Vi har en Afdeling Medarbejder klasse, der har et mange-til-en forhold til en Afdeling klasse:

@Entity offentlig klasse DeptEmployee {@Id @GeneratedValue (strategi = GenerationType.SEQUENCE) privat lang id; privat streng titel; @ManyToOne privat afdeling; }

Også den Afdeling enhed, der kortlægges til flere Afdeling Medarbejdere:

@Entity public class Department {@Id @GeneratedValue (strategi = GenerationType.SEQUENCE) privat lang id; privat strengnavn; @OneToMany (mappedBy = "afdeling") private List-medarbejdere; }

3. Den CriteriaBuilder.In

Lad os først og fremmest bruge CriteriaBuilder interface. Det i() metode accepterer en Udtryk og returnerer et nyt Prædikat af CriteriaBuilder.In type. Det kan bruges til at teste, om det givne udtryk er indeholdt i listen over værdier:

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

4. Den Udtryk. I

Alternativt kan vi bruge et sæt overbelastet i() metoder fra Udtryk grænseflade:

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

I kontrast til CriteriaBuilder.i(), det Expression.in () accepterer en samling af værdier. Som vi kan se, forenkler det også vores kode en smule.

5. I Udtryk ved hjælp af underforespørgsler

Indtil videre har vi brugt samlinger med foruddefinerede værdier. Lad os nu se på et eksempel, når en samling stammer fra et output fra en underforespørgsel.

For eksempel kan vi hente alt Afdeling Medarbejders der tilhører en Afdeling, med det angivne nøgleord i deres navn:

Underforespørgsel underforespørgsel = 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")). værdi (underforespørgsel));

Her oprettede vi en underforespørgsel, der derefter blev sendt til værdi() som et udtryk for at søge efter Afdeling enhed.

6. Konklusion

I denne hurtige artikel har vi lært forskellige måder at opnå IN-operationen ved hjælp af Criteria API. Vi har også undersøgt, hvordan man bruger Criteria API med underforespørgsler.

Endelig er den komplette implementering af denne vejledning tilgængelig på GitHub.