Jestem w sytuacji, gdy nasza firma ma usługę wyszukiwania baz danych, która jest wysoce konfigurowalna, dla której bardzo przydatne jest konfigurowanie zapytań w sposób programistyczny. Interfejs API Criteria jest potężny, ale gdy jeden z naszych programistów odrzuca jeden z obiektów danych, ograniczenia kryteriów nie będą sygnalizować, że są uszkodzone, dopóki nie przeprowadzimy naszych testów jednostkowych, lub co gorsza, na żywo iw naszym środowisku produkcyjnym. Niedawno mieliśmy projekt związany z refaktoryzacją, który w wyniku tego problemu był zasadniczo podwójnie wydłużony w czasie pracy, a różnica w planowaniu projektu polegała na tym, że gdybyśmy wiedzieli, jak długo to potrwa, prawdopodobnie przyjęlibyśmy alternatywne podejście.Jak pozbyć się ograniczeń Kryteriów Hibernacji i Przykładowych API?
Chciałbym użyć przykładowego interfejsu API, aby rozwiązać ten problem. Kompilator Java może głośno wskazać, że nasze zapytania są zrywane, jeśli określamy warunki "where" na prawdziwych właściwościach POJO. W przykładowym interfejsie API jest jednak tylko tyle funkcji, które ogranicza na wiele sposobów. Weźmy następujący przykład
Product product = new Product();
product.setName("P%");
Example prdExample = Example.create(product);
prdExample.excludeProperty("price");
prdExample.enableLike();
prdExample.ignoreCase();
Tutaj właściwość „nazwa” jest pytani przed (gdzie nazwa jak „P%”), a gdybym usunąć lub zmienić nazwę pola „Nazwa”, chcielibyśmy wiedzieć natychmiast . Ale co z nieruchomością "cena"? Jest wykluczany, ponieważ obiekt Product ma dla niego wartość domyślną, więc przekazujemy nazwę właściwości "price" do filtru wykluczającego. Teraz, jeśli "cena" zostanie usunięta, zapytanie to będzie składniowo nieprawidłowe i nie będzie wiadomo, dopóki nie zostanie uruchomione środowisko wykonawcze. KULAWY.
Innym problemem - co zrobić, jeśli dodaliśmy drugi gdzie klauzuli:
product.setPromo("Discounts up to 10%");
Ze względu na wezwanie do enableLike(), w tym przykładzie będzie pasował na tekst promocyjny „Rabaty do 10%”, ale także "Rabaty do 10 000 000 dolarów" lub cokolwiek innego, co pasuje. Ogólnie rzecz biorąc, modyfikacje całego obiektu Przykładowego obiektu, takie jak enableLike() lub ignoreCase(), nie zawsze będą miały zastosowanie do każdej sprawdzanej właściwości.
Oto trzeci i poważny problem - a co z innymi kryteriami specjalnymi? Nie ma sposobu, aby zdobyć każdy produkt za cenę wyższą niż 10 USD za pomocą standardowego schematu przykładowego. Nie ma możliwości zamówienia wyników przez promocję, zniżanie. Jeśli obiekt produktu dołączył do niektórych producentów, nie ma możliwości dodania kryterium do powiązanego obiektu producenta. Nie ma sposobu, aby bezpiecznie określić FetchMode na kryterium dla producenta (chociaż jest to problem z API Criteria w ogóle - nieprawidłowe pobrane relacje nie działają w sposób cichy, nawet więcej z bomby zegarowej)
Dla wszystkich powyższych Na przykład, powinieneś powrócić do API Criteria i użyć reprezentacji łańcuchowej właściwości do wykonania zapytania - znowu eliminując największą korzyść z przykładowych zapytań.
Jakie alternatywy dla przykładu interfejsu API dają nam porady na temat kompilacji, których potrzebujemy?
To jest bardzo interesująca rzecz, ale stackoverflow nie jest forum dyskusyjnym, nie dostaniesz tutaj opinii, a twoje pytanie prawdopodobnie zostanie zamknięte w obecnej formie. Jak wspomniano w FAQ, * "równie dobrze jest zadawać i odpowiadać na twoje własne pytanie, o ile udajesz, że jesteś w Jeopardy: sformułuj to w formie pytania" *. Proponuję przeformułować ją i zamieścić szczegóły w odpowiedzi. –
@Pascal dzięki, będę kontynuować i ponownie sformatować pytanie –
Nie ma za co. I dzięki za umieszczenie tego. –