Wpis z mikrobloga

Cześć mirki, mam pytanie. Jest stary projekt z ogromnymi tabelami, gdzie w innym projekcie potrzebuje tylko pojedynczych kolumn często z rożnych tabel. Klasyczne podejście to natywne zapytanie i podawanie konkretnych kolumn z join-ami, potem mapowanie tablicy objektów na obiekt DTO. Czy jest możliwość stworzenia "fake" encji która by to opakowała i wyeliminowała to mapowanie?

Finalnie problem sprowadza się do stworzenia przyjemnego filtru, bo przy tym podejściu powstaje kaskada if-ów sprawdząjaca czy dany filtr nie jest null-em i wtedy dodawanie warunku do sql-a i potem set-owanie tego warunku jako parametru. Pomyślalem, ze mógłbym wykorzystać CriteriaQuery i warunki filtra opakować w Predicate ale Root potrzebuje encji.

Mam nadzieję, że opisałem to zrozumiale.

#java
  • 7
@piaskovitz:
Zobacz sobie metodę CriteriaBuilder.construct(Class resultClass, Selection... selections())

I w swojej FakeEntity stwórz konstruktor, który przyjmować będzie kolejne wartości zwracane z selectionów.

Rozwiązanie może nie do końca jest takie jak byś chciał, bo wciąż w konstruktorze sam musisz przypisać wartości do modelu.

Korzystając z root, jako Encje podaj tą główną, z której będziesz opierał swoje zapytanie.

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery cq = cb.createQuery(MyFakeEntity.class);
Root ent = cq.from(MyEntity.class);

Join anotherEntity =