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.