Criteria API - Et eksempel på IN-uttrykk

1. Oversikt

Vi kommer ofte over problemer der vi trenger å spørre om enheter basert på om et enkeltverdigattributt er medlem av en gitt samling.

I denne opplæringen lærer vi hvordan vi kan løse dette problemet ved hjelp av Kriterier API.

2. Eksempel på enheter

La oss ta en titt på enhetene vi skal bruke i oppskriften før vi begynner.

Vi har en Avdeling Ansatt klasse som har et mange-til-ett forhold til en Avdeling klasse:

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

Også, den Avdeling enhet som kartlegges til flere Avdeling Ansatte:

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

3. Den CriteriaBuilder.In

Først av alt, la oss bruke CriteriaBuilder grensesnitt. De i() metoden godtar en Uttrykk og returnerer en ny Predikere av CriteriaBuilder.In type. Den kan brukes til å teste om det gitte uttrykket finnes i listen over verdier:

CriteriaQuery criteriaQuery = criteriaBuilder.createQuery (DeptEmployee.class); Rotrot = criteriaQuery.from (DeptEmployee.class); I inClause = criteriaBuilder.in (root.get ("title")); for (Stringtittel: titler) {inClause.value (tittel); } criteriaQuery.select (root) .where (inClause);

4. Den Uttrykk. I

Alternativt kan vi bruke et sett med overbelastet i() metoder fra Uttrykk grensesnitt:

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

I kontrast til CriteriaBuilder.i(), den Expression.in () aksepterer en samling verdier. Som vi kan se, forenkler det også koden vår litt.

5. I Uttrykk ved bruk av underspørsmål

Så langt har vi brukt samlinger med forhåndsdefinerte verdier. La oss nå se på et eksempel når en samling er avledet fra en utdata fra en underspørsel.

For eksempel kan vi hente alt Avdeling Ansatts som tilhører a Avdeling, med det angitte nøkkelordet i navnet:

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 ("avdeling")). verdi (underforespørsel));

Her opprettet vi et underspørsmål som deretter ble sendt inn i verdi() som et uttrykk for å søke etter Avdeling enhet.

6. Konklusjon

I denne raske artikkelen har vi lært forskjellige måter å oppnå IN-operasjonen ved hjelp av Criteria API. Vi har også undersøkt hvordan du bruker Criteria API med underspørsmål.

Endelig er den komplette implementeringen av denne opplæringen tilgjengelig på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found