Odwzorowania relacyjnoobiektowe Hibernate preselekcja Projekt wspfinansowany przez Uni
Odwzorowania relacyjno-obiektowe Hibernate preselekcja Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Odwzorowania relacyjno-obiektowe Uniwersalny mechanizm preselekcji • • Obiekt typu Command (dane + parametry) Kryteria Klasa rozwijająca kryteria Metody w Generic. DAO Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 2
Odwzorowania relacyjno-obiektowe Preselection (I) public class Preselection { protected Class entity. Class; protected List<Criterion> criteria. List = new Array. List<Criterion>(); protected Set<Integer> selected. Id. Set = new Hash. Set<Integer>(); protected String table. Name = "list"; row. Input. Name = "id"; . . Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 3
Preselection (II) Odwzorowania relacyjno-obiektowe protected int current. Row = -1; protected int row. Count = 0; protected int current. Page = 0; protected int page. Size = 50; protected String sort. Property; protected int sort. Projection. Index = -1; protected boolean sort. Ascending = true; . . . Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 4
Abstract. Criterion Odwzorowania relacyjno-obiektowe public abstract class Abstract. Criterion implements Criterion, Serializable { protected String path; protected String nested. Path; protected String property; public void set. Path(String path) { this. path = path; this. nested. Path = Criteria. Helper. get. Nested. Path(path); this. property = Criteria. Helper. get. Nested. Property(path); } public abstract void prepare. Criteria(Criteria criteria); } Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 5
String. Like. Criterion Odwzorowania relacyjno-obiektowe public class String. Like. Criterion extends Abstract. Criterion { private String string. Like; public void prepare. Criteria(Criteria criteria) { String[] string. List = string. Like. split("\s"); Junction junc = Restrictions. disjunction(); for (String word : string. List) junc. add(Restrictions. ilike(get. Property(), word, Match. Mode. ANYWHERE)); criteria. add(junc); } } Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 6
Entity. List. Criterion Odwzorowania relacyjno-obiektowe public class Entity. List. Criterion extends Abstract. Criterion { private List<Integer> entity. Id. List; public void prepare. Criteria(Criteria criteria) { if (entity. Id. List!=null && !entity. Id. List. is. Empty()) { criteria. add( Restrictions. in(get. Property(), entity. Id. List)); } } Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 7
find. By. Criteria (I) Odwzorowania relacyjno-obiektowe 8 public final List<T> find. By. Criteria(Preselection preselection) { Criteria criteria = get. Session(). create. Criteria(preselection. get. Entity. Class()); Criteria. Helper helper = new Criteria. Helper(criteria); if (preselection. get. Criteria. List() != null) { for (Criterion c : preselection. get. Criteria. List()) { c. prepare. Criteria(helper. get. Subcriteria(c. get. Nested. Path())); } } Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
find. By. Criteria (II) Odwzorowania relacyjno-obiektowe criteria. set. Result. Transformer(Criteria. DISTINCT_ROOT_ENTITY); criteria. set. Projection(Projections. count. Distinct("id")); int row. Count = (Integer) criteria. unique. Result(); preselection. set. Row. Count(row. Count); helper. add. Order(preselection. get. Sort. Property(), preselection. is. Sort. Ascending()); Projection. List projection. List = Projections. projection. List(); projection. List. add(Projections. distinct(Projections. id())); projection. List. add(helper. get. Projection(preselection. get. Sort. Property())); criteria. set. Projection(projection. List); Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 9
find. By. Criteria (III) Odwzorowania relacyjno-obiektowe criteria. set. First. Result(preselection. get. Current. Page() * preselection. get. Page. Size()); criteria. set. Max. Results(preselection. get. Page. Size()); List<Integer> id. List = new Array. List<Integer>(); List<Object> result. List = criteria. list(); for (Object o : result. List) { Object[] row = (Object[]) o; Integer id = (Integer) row[0]; id. List. add(id); } Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 10
find. By. Criteria (IV) Odwzorowania relacyjno-obiektowe criteria = get. Session(). create. Criteria(preselection. get. Entity. Class()); helper = new Criteria. Helper(criteria); criteria. set. Result. Transformer(Criteria. DISTINCT_ROOT_ENTITY); criteria. add(Restrictions. in("id", id. List)); helper. add. Order(preselection. get. Sort. Property(), preselection. is. Sort. Ascending()); List list = criteria. list(); for (int i=0; i<list. size(); ++i) list. set(i, (T)list. get(i)); return list; } Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 11
Criteria. Helper (I) Odwzorowania relacyjno-obiektowe public class Criteria. Helper { private Map<String, Criteria> criteria. Map; public Criteria. Helper(Criteria criteria) { criteria. Map = new Hash. Map<String, Criteria>(); criteria. Map. put(null, criteria); }. . . Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 12
Criteria. Helper (II) Odwzorowania relacyjno-obiektowe public static final String get. Nested. Path(String path) { int k = path. last. Index. Of('. '); return (k > 0) ? path. substring(0, k) : null; } public static final String get. Nested. Property(String path) { int k = path. last. Index. Of('. '); return (k > 0) ? path. substring(k+1) : path; } Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 13
Criteria. Helper (III) Odwzorowania relacyjno-obiektowe private static final String get. Alias. For. Nested. Path(String path) { if ( path == null) return null; return '_' + path. replace('. ', '_'); } private static final String get. Full. Path(String nested. Path, String property) { if (String. Utils. has. Text(nested. Path)) return nested. Path + '. ' + property; else return property; } Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 14
Criteria. Helper (IV) Odwzorowania relacyjno-obiektowe public Criteria get. Subcriteria(String nested. Path) { Criteria c = criteria. Map. get(nested. Path); if (c == null) { String parent = get. Nested. Path(nested. Path); String prop = get. Nested. Property(nested. Path); c = get. Subcriteria(parent); c = c. create. Criteria(prop, get. Alias. For. Nested. Path(nested. Path), Criteria. LEFT_JOIN); criteria. Map. put(nested. Path, c); } return c; }. . . } Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 15
Wykorzystanie Odwzorowania relacyjno-obiektowe preselection = new Preselection(Komputer. class); preselection. get. Criteria. List(). add ( new String. Like. Criterion("identyfikator", ”KL-”)); preselection. get. Criteria. List(). add(new Int. Criterion("faktura. id", 4)); Array. List<Urzadzenie> list = (Array. List<Urzadzenie>) urzadzenie. Service. find. By. Criteria(preselection); Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 16
- Slides: 16