Criteria API - példa IN kifejezésekre

1. Áttekintés

Gyakran találkozunk olyan problémákkal, amikor entitásokat kell lekérdeznünk annak alapján, hogy az egyértékű attribútum egy adott gyűjtemény tagja-e.

Ebben az oktatóanyagban megtudhatjuk, hogyan lehet megoldani ezt a problémát a Kritériumok API.

2. Minta entitások

Mielőtt elkezdenénk, vessünk egy pillantást azokra az entitásokra, amelyeket az írásunkban használni fogunk.

Nekünk van DeptEmployee osztály, amelynek sok az egyben kapcsolata van a Osztály osztály:

@Entity public class DeptEmployee {@Id @GeneratedValue (strategy = GenerationType.SEQUENCE) private long id; privát húr cím; @ManyToOne magánosztály osztály; }

Továbbá a Osztály entitás, amely többszörösre képez DeptEmployees:

@Entity public class Department {@Id @GeneratedValue (strategy = GenerationType.SEQUENCE) private long id; privát karakterlánc neve; @OneToMany (mappedBy = "osztály") magánlista alkalmazottai; }

3. Az CriteriaBuilder.In

Először is használjuk a CriteriaBuilder felület. A ban ben() módszer elfogad egy Kifejezés és egy újat ad vissza Állítmány a CriteriaBuilder.In típus. Használható annak tesztelésére, hogy az adott kifejezés szerepel-e az értékek listájában:

CriteriaQuery criterionQuery = criterBuilder.createQuery (DeptEmployee.class); Gyökérgyökér = feltételekQuery.from (DeptEmployee.class); In inClause = feltételekBuilder.in (root.get ("cím")); for (Karaktersorozat címe: címek) {inClause.value (title); } feltételekQuery.select (root) .where (inClause);

4. A Kifejezés.In

Alternatív megoldásként használhatunk egy túlterhelt készletet ban ben() módszerek a Kifejezés felület:

feltételekQuery.select (gyökér) .hol (root.get ("cím") .in (címek));

Ellentétben a CriteriaBuilder.ban ben(), a Expression.in () értékgyűjteményt fogad el. Mint láthatjuk, a kódunkat is kissé leegyszerűsíti.

5. BAN BEN Kifejezések alkérdezéseket használva

Eddig előre meghatározott értékű gyűjteményeket használtunk. Most nézzünk meg egy példát, amikor a gyűjtemény egy allekérdezés kimenetéből származik.

Például be tudjuk hozni az összeset DeptEmployees akik a Osztály, a megadott kulcsszóval a nevükben:

Subquery subquery = feltételekQuery.subquery (Department.class); Gyökérosztály = subquery.from (osztály.osztály); subquery.select (dept) .distinct (true) .where (feltételekBuilder.like (dept.get ("név"), "%" + searchKey + "%")); feltételekQuery.select (emp) .where (feltételekBuilder.in (emp.get ("osztály")). érték (allekérdezés));

Itt létrehoztunk egy allekérdezést, amelyet aztán továbbítottunk a érték() kifejezésként a Osztály entitás.

6. Következtetés

Ebben a rövid cikkben különböző módszereket tanultunk meg az IN művelet megvalósításához a Criteria API segítségével. Azt is megvizsgáltuk, hogyan lehet használni a Criteria API-t alkérdezésekkel.

Végül az oktatóanyag teljes megvalósítása elérhető a GitHubon.