Date: Thu, 28 Mar 2024 16:20:02 +0000 (UTC) Message-ID: <197061069.4979.1711642802749@localhost4> Subject: Exported From Confluence MIME-Version: 1.0 Content-Type: multipart/related; boundary="----=_Part_4978_1936902963.1711642802748" ------=_Part_4978_1936902963.1711642802748 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Content-Location: file:///C:/exported.html
A JPA 2.0 egyik legfontosabb =C3=BAjdons=C3=A1ga a Criteria API. Adatb= =C3=A1zisb=C3=B3l t=C3=B6rt=C3=A9n=C5=91 lek=C3=A9rdez=C3=A9sekre =C3=A9s a= datm=C3=B3dos=C3=ADt=C3=A1sra haszn=C3=A1lhat=C3=B3, ugyan=C3=BAgy, mint a = JPQL, csak Java nyelven =C3=A1ll=C3=ADtjuk vele =C3=B6ssze a lek=C3=A9rdez= =C3=A9seket. A sz=C3=B6vegben el=C5=91fordul=C3=B3 mintaprogramok EclipseLi= nk 2.3.2-vel lettek tesztelve. A f=C3=BCggel=C3=A9kben megtal=C3=A1lhat=C3= =B3 a mintaprogramokban haszn=C3=A1lt t=C3=A1bl=C3=A1k szerkezete =C3=A9s a= mintaprogramok kipr=C3=B3b=C3=A1l=C3=A1s=C3=A1hoz haszn=C3=A1lt Eclipse pr= ojekt =C3=B6ssze=C3=A1ll=C3=ADt=C3=A1sa.
Mivel a JPQL String-k=C3=A9nt t=C3=A1rolja a lek=C3=A9rdez=C3=A9seket, a= z al=C3=A1bbi probl=C3=A9m=C3=A1k mer=C3=BClnek fel:
EntityM= anager em =3D emf.createEntityManager(); CriteriaBuilder cb =3D em.getCriteriaBuilder(); CriteriaQuery<BaseDataType> cq =3D cb.createQuery(BaseDataType.class)= ; // Root<BaseDataType> r =3D cq.from(BaseDataType.class); TypedQuery<BaseDataType> tq =3D em.createQuery(cq); List<BaseDataType> results =3D tq.getResultList(); for (BaseDataType result : results) { System.out.println(result.getName()); }=20
A Criteria API haszn=C3=A1latakor el=C5=91sz=C3=B6r is sz=C3=BCks=C3=A9g= =C3=BCnk van egy CriteriaBuilder p=C3=A9ld=C3=A1nyra az EntityManager-t=C5= =91l. A CriteriaBuilder-b=C5=91l p=C3=A9ld=C3=A1nyos=C3=ADtunk egy Criteria= Query-t. A createQuery met=C3=B3dusnak =C3=A1tadott BaseDataType.class hat= =C3=A1rozza meg, hogy futtat=C3=A1skor a CriteriaQuery eredm=C3=A9ny=C3=A9n= ek mi legyen a t=C3=ADpusa. A CriteriaQuery cq.from met=C3=B3dus=C3=A1val m= egadhatn=C3=A1nk azt az entit=C3=A1st, amib=C5=91l a lek=C3=A9rdez=C3=A9s t= =C3=B6rt=C3=A9nik. Ennek az eredm=C3=A9nye egy Root p=C3=A9ld=C3=A1ny, ami = JPQL-ben a FROM ut=C3=A1n szerepl=C5=91 entit=C3=A1snak felel meg. A Root-r= a akkor is sz=C3=BCks=C3=A9g van, ha k=C3=BCl=C3=B6n-k=C3=BCl=C3=B6n akarun= k hivatkozni az entit=C3=A1s oszlopaira. Ha nem h=C3=ADvjuk meg a cq.from m= et=C3=B3dust, akkor a cb.createQuery met=C3=B3dusn=C3=A1l megadott oszt=C3= =A1ly az alap=C3=A9rtelmezett. JPQL megfelel=C5=91je:
EntityM= anager em =3D emf.createEntityManager(); TypedQuery<BaseDataType> tq =3D em.createQuery( "SELECT b FROM BaseDataType b", BaseDataType.class); List<BaseDataType> results =3Dtq.getResultList(); for (BaseDataType result : results) { System.out.println(result.getName()); }=20
EntityM= anager em =3D emf.createEntityManager(); CriteriaBuilder cb =3D em.getCriteriaBuilder(); CriteriaQuery<Object[]> cq =3D cb.createQuery(Object[].class); Root<BaseDataType> r =3D cq.from(BaseDataType.class); cq.select(cb.array(r.get("id"), r.get("name"))); // cq.multiselect(r.get("id"), r.get("name")); TypedQuery<Object[]> tq =3D em.createQuery(cq); List<Object[]> results =3D tq.getResultList(); for (Object[] result : results) { System.out.println(result[0] + " " + result[1]); }=20
Adott oszlopokat t=C3=B6bbf=C3=A9le m=C3=B3don k=C3=A9rdezhet=C3=BCnk le= a Criteria API-val:
JPQL megfelel=C5=91je:
EntityM= anager em =3D emf.createEntityManager(); TypedQuery<Object[]> tq =3D em.createQuery( "SELECT b.id, b.name FROM BaseDataType b", Object[].class); List<Object[]> results =3D tq.getResultList(); for (Object[] result : results) { System.out.println(result[0] + " " + result[1]); }=20
Ugyanennek a lek=C3=A9rdez=C3=A9snek a Multiselect-es v=C3=A1ltozat=C3= =A1hoz el=C5=91sz=C3=B6r l=C3=A9trehozunk egy BaseDataTypeVO value object o= szt=C3=A1lyt:
public = class BaseDataTypeVO { private long id; private String name; public BaseDataTypeVO(long id, String name) { this.id =3D id; this.name =3D name; } ...=20
=C3=89s ennek a felhaszn=C3=A1l=C3=A1s=C3=A1val =C3=A1ll=C3=ADtjuk el=C5= =91 a lek=C3=A9rdez=C3=A9st:
EntityM= anager em =3D emf.createEntityManager(); CriteriaBuilder cb =3D em.getCriteriaBuilder(); CriteriaQuery<BaseDataTypeVO> cq =3D cb.createQuery(BaseDataTypeVO.class); Root<BaseDataType> r =3D cq.from(BaseDataType.class); cq.multiselect(r.get("id"), r.get("name")); TypedQuery<BaseDataTypeVO> tq =3D em.createQuery(cq); List<BaseDataTypeVO> results =3D tq.getResultList(); for (BaseDataTypeVO result : results) { System.out.println(result.getId() + " " + result.getName()); }=20
EntityM= anager em =3D emf.createEntityManager(); CriteriaBuilder cb =3D em.getCriteriaBuilder(); CriteriaQuery<BaseDataType> cq =3D cb.createQuery(BaseDataType.class)= ; Root<BaseDataType> r =3D cq.from(BaseDataType.class); Path<String> p =3D r.get("name"); Predicate p1 =3D cb.like(p, "c%"); Predicate p2 =3D cb.like(p, "p%"); cq.where(cb.or(p1, p2)); TypedQuery<BaseDataType> tq =3D em.createQuery(cq); List<BaseDataType> results =3D tq.getResultList(); for (BaseDataType result : results) { System.out.println(result.getId() + " " + result.getName()); }=20
A fent l=C3=A1that=C3=B3 lek=C3=A9rdez=C3=A9s azokat a BaseDataType-okat= adja vissza, melyek name attrib=C3=BAtuma c-vel vagy p-vel kezd=C5=91dik. = A Root p=C3=A9ld=C3=A1nyt=C3=B3l k=C3=A9r=C3=BCnk egy Path p=C3=A9ld=C3=A1n= yt, amit felhaszn=C3=A1lhatunk a lek=C3=A9rdez=C3=A9s k=C3=BCl=C3=B6nb=C3= =B6z=C5=91 r=C3=A9szeinek az =C3=B6ssze=C3=A1ll=C3=ADt=C3=A1s=C3=A1ban az e= ntit=C3=A1s egy attrib=C3=BAtum=C3=A1nak jel=C3=B6l=C3=A9s=C3=A9re. A lek= =C3=A9rdez=C3=A9s Where felt=C3=A9tel=C3=A9nek =C3=B6ssze=C3=A1ll=C3=ADt=C3= =A1s=C3=A1ra a CriteriaBuilder met=C3=B3dusait (like, or) haszn=C3=A1ljuk. = Az =C3=B6ssze=C3=A1ll=C3=ADtott Where felt=C3=A9telt v=C3=A9g=C3=BCl a Crit= eriaQuery where met=C3=B3dus=C3=A1nak adjuk =C3=A1t. JPQL megfelel=C5=91je:=
EntityM= anager em =3D emf.createEntityManager(); TypedQuery<BaseDataType> tq =3D em.createQuery( "SELECT b FROM BaseDataType b " + "WHERE b.name LIKE :p1 OR b.name LIKE :p2", BaseDataType.class); tq.setParameter("p1", "c%"); tq.setParameter("p2", "p%"); List<BaseDataType> results =3Dtq.getResultList(); for (BaseDataType result : results) { System.out.println(result.getId() + " " + result.getName()); }=20
EntityM= anager em =3D emf.createEntityManager(); CriteriaBuilder cb =3D em.getCriteriaBuilder(); CriteriaQuery<BaseDataType> cq =3D cb.createQuery(BaseDataType.class)= ; Root<BaseDataType> r =3D cq.from(BaseDataType.class); List<Integer> ids =3D new ArrayList<Integer>(); ids.add(10); ids.add(11); ids.add(12); cq.where(r.get("id").in(ids)); TypedQuery<BaseDataType> tq =3D em.createQuery(cq); List<BaseDataType> results =3D tq.getResultList(); for (BaseDataType result : results) { System.out.println(result.getId() + " " + result.getName()); }=20
A fenti lek=C3=A9rdez=C3=A9ssel azokat a BaseDataType-okat k=C3=A9rdezz= =C3=BCk le, melyeknek az azonos=C3=ADt=C3=B3ja 10, 11 vagy 12. JPQL megfele= l=C5=91je:
EntityM= anager em =3D emf.createEntityManager(); TypedQuery<BaseDataType> tq =3D em.createQuery( "SELECT b FROM BaseDataType b " + "WHERE b.id IN :p1 ", BaseDataType.class); List<Integer> ids =3D new ArrayList<Integer>(); ids.add(10); ids.add(11); ids.add(12); tq.setParameter("p1", ids); List<BaseDataType> results =3Dtq.getResultList(); for (BaseDataType result : results) { System.out.println(result.getId() + " " + result.getName()); }=20
String = name =3D null; name =3D "non"; EntityManager em =3D emf.createEntityManager(); CriteriaBuilder cb =3D em.getCriteriaBuilder(); CriteriaQuery<BaseDataType> cq =3D cb.createQuery(BaseDataType.class)= ; Root<BaseDataType> r =3D cq.from(BaseDataType.class); List<Predicate> predicateList =3D new ArrayList<Predicate>(); predicateList.add(cb.isNotNull(r.<Integer>get("id"))); if (name !=3D null && name.length() > 0) { String pattern =3D "%" + name.toUpperCase() + "%"; predicateList.add(cb.like(cb.upper(r.<String>get("name")),= pattern)); } Predicate[] predicates =3D new Predicate[predicateList.size()]; predicateList.toArray(predicates); cq.where(predicates); TypedQuery<BaseDataType> tq =3D em.createQuery(cq); List<BaseDataType> results =3D tq.getResultList(); for (BaseDataType result : results) { System.out.println(result.getId() + " " + result.getName()); }=20
A fenti lek=C3=A9rdez=C3=A9s azt mutatja be, amikor nem ismerj=C3= =BCk pontosan a felt=C3=A9telek sz=C3=A1m=C3=A1t, =C3=ADgy a CriteriaQuery = where met=C3=B3dus=C3=A1nak egy Predicate[] t=C3=B6mb=C3=B6t adunk =C3=A1t.= Az =C3=A1tadott Predicate-ek k=C3=B6z=C3=B6tt AND kapcsolat fog megval=C3= =B3sulni. JPQL megfelel=C5=91je:
String = name =3D null; name =3D "non"; EntityManager em =3D emf.createEntityManager(); StringBuilder sb =3D new StringBuilder( "SELECT b FROM BaseDataType b WHERE b.id IS NOT NULL " ); if (name !=3D null && name.length() > 0) { sb.append(" AND UPPER(b.name) LIKE :p1 "); } TypedQuery<BaseDataType> tq =3D em.createQuery(sb.toString(), BaseDataType.class); if (name !=3D null && name.length() > 0) { tq.setParameter("p1", "%" + name.toUpperCase() + "%"); } List<BaseDataType> results =3D tq.getResultList(); for (BaseDataType result : results) { System.out.println(result.getId() + " " + result.getName()); }=20
EntityM= anager em =3D emf.createEntityManager(); CriteriaBuilder cb =3D em.getCriteriaBuilder(); CriteriaQuery<Object[]> cq =3D cb.createQuery(Object[].class); Root<BaseDataType> r =3D cq.from(BaseDataType.class); Join<BaseDataType, BaseData> j =3D r.join("baseData"); cq.multiselect(r.get("name"), j.get("value")); TypedQuery<Object[]> tq =3D em.createQuery(cq); List<Object[]> results =3D tq.getResultList(); for (Object[] result : results) { System.out.println(result[0] + " " + result[1]); }=20
A Root p=C3=A9ld=C3=A1nyhoz t=C3=B6rt=C3=A9n=C5=91 =C3=B6sszef=C5=B1z=C3= =A9ssel t=C3=B6bb t=C3=A1bl=C3=A1s lek=C3=A9rdez=C3=A9st val=C3=B3s=C3=ADth= atunk meg. Az eredm=C3=A9ny=C3=BCl kapott Join objektum seg=C3=ADts=C3=A9g= =C3=A9vel hivatkozhatunk az =C3=B6sszef=C5=B1z=C3=B6tt entit=C3=A1s mez=C5= =91ire. A join met=C3=B3dusnak egy JoinType attrib=C3=BAtumot is meg lehet = adni:
Join<= ;BaseDataType, BaseData> j =3D r.join("baseData", JoinType.INNER);= =20
A JoinType lehets=C3=A9ges =C3=A9rt=C3=A9kei: INNER, LEFT, RIGHT. Az INN= ER az alap=C3=A9rtelmezett. JPQL megfelel=C5=91je:
EntityM= anager em =3D emf.createEntityManager(); TypedQuery<Object[]> tq =3D em.createQuery( "SELECT bdt.name, bd.value FROM BaseDataType bdt " + "JOIN bdt.baseData bd", Object[].class); List<Object[]> results =3D tq.getResultList(); for (Object[] result : results) { System.out.println(result[0] + " " + result[1]); }=20
EntityM= anager em =3D emf.createEntityManager(); CriteriaBuilder cb =3D em.getCriteriaBuilder(); CriteriaQuery<Object[]> cq =3D cb.createQuery(Object[].class); Root<BaseDataType> r1 =3D cq.from(BaseDataType.class); Root<BaseData> r2 =3D cq.from(BaseData.class); cq.where(cb.equal(r1.get("id"), r2.get("id"))); cq.multiselect(r1.get("id"), r1.get("name"), r2.get("id"), r2.get("value"))= ; TypedQuery<Object[]> tq =3D em.createQuery(cq); List<Object[]> results =3D tq.getResultList(); for (Object[] result : results) { System.out.println( result[0] + " " + result[1] + " " + result[2] + " " += result[3] ); }=20
Ha olyan attrib=C3=BAtumok ment=C3=A9n akarunk k=C3=A9t entit=C3=A1st = =C3=B6sszef=C5=B1zni, amik szerint entit=C3=A1s szinten nincsenek kapcsolat= ban, akkor k=C3=A9t Root p=C3=A9ld=C3=A1nyt kell l=C3=A9trehoznunk, =C3=A9s= ezeket Where felt=C3=A9tellel kell =C3=B6sszekapcsolnunk. A Where felt=C3= =A9tel =C3=B6ssze=C3=A1ll=C3=ADt=C3=A1sakor figyelj=C3=BCnk arra, hogy a k= =C3=A9t entit=C3=A1s k=C3=A9t =C3=B6sszekapcsoland=C3=B3 attrib=C3=BAtuma a= zonos t=C3=ADpus=C3=BA legyen pl: long. Ha a Where felt=C3=A9telben nem kap= csoljuk =C3=B6ssze a k=C3=A9t entit=C3=A1st, akkor Descartes - szorzatot hozunk l=C3=A9tre= . A fenti, =E2=80=93 =C3=BCzletileg nem t=C3=BAl =C3=A9rtelmes =E2=80= =93 p=C3=A9ld=C3=A1ban BaseDataType.id=3DBaseData.id alapj=C3=A1n kapc= solom =C3=B6ssze a k=C3=A9t entit=C3=A1st. JPQL megfelel=C5=91je:
EntityM= anager em =3D emf.createEntityManager(); TypedQuery<Object[]> tq =3D em.createQuery( "SELECT bdt.id, bdt.name, bd.id, bd.value " + "FROM BaseDataType bdt, BaseData bd " + "WHERE bdt.id =3D bd.id", Object[].class); List<Object[]> results =3D tq.getResultList(); for (Object[] result : results) { System.out.println( result[0] + " " + result[1] + " " + result[2] + " " += result[3] ); }=20
EntityM= anager em =3D emf.createEntityManager(); CriteriaBuilder cb =3D em.getCriteriaBuilder(); CriteriaQuery<BaseDataType> cq =3D cb.createQuery(BaseDataType.class)= ; Root<BaseDataType> r =3D cq.from(BaseDataType.class); Subquery<BaseData> subQuery =3D cq.subquery(BaseData.class); Root<BaseData> subQueryRoot =3D subQuery.from(BaseData.class); Predicate p1 =3D cb.like(subQueryRoot.<String>get("value"), "%fix%"); Predicate p2 =3D cb.equal(r.get("baseData"), subQueryRoot); subQuery.where(cb.and(p1, p2)); cq.where((cb.exists(subQuery))); TypedQuery<BaseDataType> tq =3D em.createQuery(cq); List<BaseDataType> results =3D tq.getResultList(); for (BaseDataType result : results) { System.out.println(result.getId() + " " + result.getName()); }=20
Azokat a BaseDataType-okat adja vissza, melyekhez tartozik olyan BaseDat= a, aminek a value mez=C5=91j=C3=A9ben szerepel a "fix" String. EXISTS-el ka= pcsolja =C3=B6ssze a k=C3=A9t t=C3=A1bl=C3=A1t Subquery seg=C3=ADts=C3=A9g= =C3=A9vel. A BaseDataType entit=C3=A1sban a baseData mez=C5=91 t=C3=ADpusa = Set<BaseData>. De ez nem okoz probl=C3=A9m=C3=A1t a Predicate p2 megh= at=C3=A1roz=C3=A1s=C3=A1n=C3=A1l, ahol a k=C3=A9t entit=C3=A1st =C3=B6sszek= =C3=B6tj=C3=BCk az equal met=C3=B3dussal. Az =C3=B6sszek=C3=B6t=C3=A9st a m= =C3=A1sik ir=C3=A1nyb=C3=B3l is megtehetn=C3=A9nk:
Predica= te p2 =3D cb.equal(r, subQueryRoot.get("baseDataType"));=20
JPQL megfelel=C5=91je:
EntityM= anager em =3D emf.createEntityManager(); String query =3D "SELECT bdt " + "FROM BaseDataType bdt " + "WHERE EXISTS ( " + "SELECT bd FROM BaseData bd WHERE bdt.baseData =3D bd " + "AND bd.value LIKE :p1 " + ")"; TypedQuery<BaseDataType> tq =3D em.createQuery(query, BaseDataType.class); tq.setParameter("p1", "%fix%"); List<BaseDataType> results =3D tq.getResultList(); for (BaseDataType result : results) { System.out.println(result.getId() + " " + result.getName()); }=20
EntityM= anager em =3D emf.createEntityManager(); CriteriaBuilder cb =3D em.getCriteriaBuilder(); CriteriaQuery<Object[]> cq =3D cb.createQuery(Object[].class); Root<BaseDataType> r =3D cq.from(BaseDataType.class); Join<BaseDataType, BaseData> j =3D r.join("baseData"); Path<String> p =3D r.get("name"); cq.groupBy(p); cq.orderBy(cb.asc(p)); cq.multiselect(r.get("name"), cb.count(r)); TypedQuery<Object[]> tq =3D em.createQuery(cq); List<Object[]> results =3D tq.getResultList(); for (Object[] result : results) { System.out.println(result[0] + " " + result[1]); }=20
A lek=C3=A9rdez=C3=A9s Group by =C3=A9s Order by r=C3=A9sz=C3=A9nek =C3= =B6ssze=C3=A1ll=C3=ADt=C3=A1s=C3=A1hoz is a kor=C3=A1bban megismert Path p= =C3=A9ld=C3=A1nyt =C3=A9s a CriteriaBuilder asc met=C3=B3dus=C3=A1t haszn= =C3=A1ljuk. Az =C3=B6ssze=C3=A1ll=C3=ADtott kifejez=C3=A9seket v=C3=A9g=C3= =BCl a CriteriaQuery groupBy =C3=A9s orderBy met=C3=B3dusainak adjuk =C3=A1= t. A CriteriaQuery multiselect r=C3=A9sz=C3=A9ben a CriteriaBuilder seg=C3= =ADts=C3=A9g=C3=A9vel egy count kifejez=C3=A9st is =C3=B6ssze=C3=A1ll=C3=AD= tunk. JPQL megfelel=C5=91je:
EntityM= anager em =3D emf.createEntityManager(); TypedQuery<Object[]> tq =3D em.createQuery( "SELECT bdt.name, COUNT(bdt) FROM BaseDataType bdt " + "JOIN bdt.baseData bd GROUP BY bdt.name ORDER BY bdt.name", Object[].class); List<Object[]> results =3D tq.getResultList(); for (Object[] result : results) { System.out.println(result[0] + " " + result[1]); }=20
EntityM= anager em =3D emf.createEntityManager(); CriteriaBuilder cb =3D em.getCriteriaBuilder(); CriteriaQuery<BigDecimal> cq =3D cb.createQuery(BigDecimal.class); Root<BaseData> r =3D cq.from(BaseData.class); cq.multiselect(cb.max(r.<BigDecimal>get("id"))); TypedQuery<BigDecimal> tq =3D em.createQuery(cq); System.out.println("result: " + tq.getSingleResult());=20
A max f=C3=BCggv=C3=A9ny haszn=C3=A1lat=C3=A1t mutatja be. =C3=89rdekess= =C3=A9g, hogy a Criteria API BigDecimal-t haszn=C3=A1l, a JPQL pedig Long-o= t. JPQL megfelel=C5=91je:
EntityM= anager em =3D emf.createEntityManager(); TypedQuery<Long> tq =3D em.createQuery( "SELECT max(bd.id) FROM BaseData bd ", Long.class); System.out.println("result: " + tq.getSingleResult());=20
... Root<BaseDataType> r =3D cq.from(BaseDataType.class); Join<BaseDataType, BaseData> j =3D r.join("baseData"); Path<SpecialBaseData> p1 =3D (Path<SpecialBaseData>)j.as(SpecialBaseData.= class); ...=20
Az Expression.as(type) seg=C3=ADts=C3=A9g=C3=A9vel lesz=C3=A1rmaztatott = oszt=C3=A1lyk=C3=A9nt k=C3=A9rdezhet=C3=BCnk le az entity szinten =C5=91sos= zt=C3=A1lyk=C3=A9nt =C3=B6sszef=C5=B1z=C3=B6tt entit=C3=A1st. A cast-ol=C3= =A1ssal a Join node v=C3=A9glegesen =C3=A1tv=C3=A1ltozik SpecialBaseDat=C3= =A1v=C3=A1. A SpecialBaseData oszt=C3=A1ly hi=C3=A1nyzik a f=C3=BCggel=C3= =A9kb=C5=91l:
package= criteriaapidemo; public class SpecialBaseData extends BaseData {}=20
JPQL megfelel=C5=91je:
... TypedQuery<Object[]> tq =3D em.createQuery( "SELECT bdt.name, COUNT(bdt) FROM BaseDataType bdt " + "JOIN TREAT(bdt.baseData as SpecialBaseData) bd " + "GROUP BY bdt.name ORDER BY bdt.name", Object[].class); ...=20
EntityM= anager em =3D emf.createEntityManager(); CriteriaBuilder cb =3D em.getCriteriaBuilder(); CriteriaQuery<BaseDataType> cq =3D cb.createQuery(BaseDataType.class)= ; Root<BaseDataType> r =3D cq.from(BaseDataType.class); Metamodel m =3D em.getMetamodel(); EntityType<BaseDataType> et =3D m.entity(BaseDataType.class); SingularAttribute<BaseDataType, String> sa =3D et.getDeclaredSingularAttribute("name", String.class); Path<String> p =3D r.get(sa); // Path<String> p =3D r.get("name"); Predicate p1 =3D cb.like(p, "c%"); Predicate p2 =3D cb.like(p, "p%"); cq.where(cb.or(p1, p2)); TypedQuery<BaseDataType> tq =3D em.createQuery(cq); List<BaseDataType> results =3D tq.getResultList(); for (BaseDataType result : results) { System.out.println(result.getId() + " " + result.getName()); }=20
A JPA 2.0 =C3=BAjdons=C3=A1ga a Metamodel API is. A Metamodel API seg=C3= =ADts=C3=A9g=C3=A9vel dinamikusan k=C3=A9rdezhetj=C3=BCk le egy entit=C3=A1= s attrib=C3=BAtumait. Most a Where felt=C3=A9tel bemutat=C3=A1s=C3=A1n=C3= =A1l haszn=C3=A1lt lek=C3=A9rdez=C3=A9st l=C3=A1thatjuk, azzal a v=C3=A1lto= ztat=C3=A1ssal, hogy a BaseDataType entit=C3=A1s =E2=80=9Ename=E2=80=9D att= rib=C3=BAtum=C3=A1t Metamodel seg=C3=ADts=C3=A9g=C3=A9vel =C3=A1ll=C3=ADtju= k el=C5=91. A Metamodel haszn=C3=A1lat=C3=A1hoz az EntityManagert=C5=91l k= =C3=A9rhet=C3=BCnk egy Metamodel objektumot. A Metamodelb=C5=91l egy Entity= Type-ot k=C3=A9rhet=C3=BCnk, ami seg=C3=ADts=C3=A9g=C3=A9vel az entit=C3=A1= s perzisztens attrib=C3=BAtumai k=C3=B6z=C3=B6tt b=C3=B6ng=C3=A9szhet=C3=BC= nk. A SingularAttribute felel meg az entit=C3=A1s egy szimpla Object attrib= =C3=BAtum=C3=A1nak. De ha p=C3=A9ld=C3=A1ul Collection t=C3=ADpus=C3=BA att= rib=C3=BAtumot k=C3=A9rdezn=C3=A9nk le, akkor az EntityType getDeclaredColl= ection met=C3=B3dus=C3=A1t haszn=C3=A1lhatjuk, ami CollectionAttribute t=C3= =ADpus=C3=BA objektumot ad vissza. A SingularAtribute felhaszn=C3=A1l=C3=A1= s=C3=A1val a Root objektumt=C3=B3l k=C3=A9r=C3=BCnk egy Path objektumot, am= it felhaszn=C3=A1lhatunk a lek=C3=A9rdez=C3=A9s k=C3=BCl=C3=B6nb=C3=B6z=C5= =91 r=C3=A9szeinek az =C3=B6ssze=C3=A1ll=C3=ADt=C3=A1s=C3=A1ban az entit=C3= =A1s egy attrib=C3=BAtum=C3=A1nak jel=C3=B6l=C3=A9s=C3=A9re. Kikommentezve = l=C3=A1that=C3=B3 a Path p=C3=A9ld=C3=A1ny el=C5=91=C3=A1ll=C3=ADt=C3=A1s= =C3=A1nak m=C3=B3dja Metamodel n=C3=A9lk=C3=BCl. Az ezut=C3=A1n j=C3=B6v=C5= =91 sorok =C3=A9s a lek=C3=A9rdez=C3=A9s JPQL megfelel=C5=91je megegyeznek = a Where felt=C3=A9teln=C3=A9l l=C3=A1tottakkal.
A Metamodel API seg=C3=ADts=C3=A9g=C3=A9vel azont=C3=BAl, hogy dinamikus= an lek=C3=A9rdezhetj=C3=BCk egy entit=C3=A1s attrib=C3=BAtumait, lehet=C5= =91s=C3=A9g=C3=BCnk van strongly typed lek=C3=A9rdez=C3=A9sek =C3=ADr=C3=A1= s=C3=A1ra is. Most a Where felt=C3=A9tel =C3=A9s a Metamodel ismertet=C3=A9= s=C3=A9n=C3=A9l haszn=C3=A1lt lek=C3=A9rdez=C3=A9s strongly typed Metamodel= -es v=C3=A1ltozat=C3=A1t =C3=A1ll=C3=ADtjuk =C3=B6ssze. Els=C5=91 l=C3=A9p= =C3=A9sk=C3=A9nt StaticMetamodel oszt=C3=A1lyokat kell =C3=A9p=C3=ADten=C3= =BCnk az entit=C3=A1s oszt=C3=A1lyaink mell=C3=A9. Ezeket az oszt=C3=A1lyok= at c=C3=A9lszer=C5=B1 gener=C3=A1lni, amihez az EclipseLink annotation proc= essor=C3=A1t vessz=C3=BCk ig=C3=A9nybe. A k=C3=B6vetkez=C5=91 parancsot k= =C3=B6zvetlen=C3=BCl a projekt k=C3=B6nyvt=C3=A1runkb=C3=B3l kell futtatni = =E2=80=93 amiben az src k=C3=B6nyvt=C3=A1r van. De el=C5=91tte pontos=C3=AD= tsuk az eclipselink.jar =C3=A9s a javax.persistence...jar hely=C3=A9t. A pa= rancsot egy sorba kell le=C3=ADrni, c=C3=A9lszer=C5=B1 egy bat f=C3=A1jlba:=
javac -= processor org.eclipse.persistence.internal.jpa.modelgen.CanonicalModelProce= ssor=20
Futtat=C3=A1s ut=C3=A1n egy BaseData_.java =C3=A9s egy BaseDataType_.jav= a keletkezik:
@Genera= ted(value=3D"EclipseLink-2.3.2.v20111125-r10461", date=3D"2012-03-02T21:50:= 47") @StaticMetamodel(BaseDataType.class) public class BaseDataType_ { public static volatile SingularAttribute<BaseDataType, Long> id; public static volatile SingularAttribute<BaseDataType, String> na= me; public static volatile SetAttribute<BaseDataType, BaseData> baseD= ata; }=20
@Genera= ted(value=3D"EclipseLink-2.3.2.v20111125-r10461", date=3D"2012-03-02T21:50:= 47") @StaticMetamodel(BaseData.class) public class BaseData_ { public static volatile SingularAttribute<BaseData, Long> id; public static volatile SingularAttribute<BaseData, BaseDataType> = baseDataType; public static volatile SingularAttribute<BaseData, String> value; }=20
A BaseDataType_ oszt=C3=A1ly felhaszn=C3=A1l=C3=A1s=C3=A1val =C3=ADgy = =C3=A1ll=C3=ADthatjuk =C3=B6ssze a lek=C3=A9rdez=C3=A9st:
EntityM= anager em =3D emf.createEntityManager(); CriteriaBuilder cb =3D em.getCriteriaBuilder(); CriteriaQuery<BaseDataType> cq =3D cb.createQuery(BaseDataType.class)= ; Root<BaseDataType> r =3D cq.from(BaseDataType.class); Path<String> p =3D r.get(BaseDataType_.name); Predicate p1 =3D cb.like(p, "c%"); Predicate p2 =3D cb.like(p, "p%"); cq.where(cb.or(p1, p2)); TypedQuery<BaseDataType> tq =3D em.createQuery(cq); List<BaseDataType> results =3D tq.getResultList(); for (BaseDataType result : results) { System.out.println(result.getId() + " " + result.getName()); }=20
A lek=C3=A9rdez=C3=A9sben csak a Path el=C5=91=C3=A1ll=C3=ADt=C3=A1sa v= =C3=A1ltozott.
public = static String escapeLikeExpression(final String expression) { return expression.replace("!", "'!").replace("_", "!_") .replace("%", "!%"); }=20
Ind=C3=ADtsuk el az Eclipse k=C3=B6rnyezetet.
package= criteriaapidemo; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import javax.persistence.TypedQuery; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Root; public class CriteriaApiDemoMain { public static void main(String[] args) { EntityManagerFactory emf =3D Persistence.createEntityManagerFactory("= CriteriaApiDemo"); EntityManager em =3D emf.createEntityManager(); CriteriaBuilder cb =3D em.getCriteriaBuilder(); CriteriaQuery<BaseDataType> cq =3D cb.createQ= uery(BaseDataType.class); // Root<BaseDataType> r =3D cq.from(BaseDataT= ype.class); TypedQuery<BaseDataType> tq =3D em.createQuer= y(cq); List<BaseDataType> results =3D tq.getResultLi= st(); for (BaseDataType result : results) { System.out.println(result.getName()); } } }=20
CREATE = TABLE BASE_DATA_TYPE ( ID NUMBER(10,0) NOT NULL ENABLE, NAME VARCHAR2(4000 BYTE), PRIMARY KEY (ID) ); CREATE TABLE BASE_DATA ( ID NUMBER(10,0) NOT NULL ENABLE, VALUE VARCHAR2(4000 BYTE), BASE_DATA_TYPE_ID NUMBER(10,0), PRIMARY KEY (ID), CONSTRAINT FK_BASE_DATA_BASE_DATA_TYPE_ID FOREIGN KEY (BASE_DATA_TYPE_I= D) REFERENCES BASE_DATA_TYPE (ID) );=20