Witam,
Szukam pomocy, gdyż mam problem z przerobieniem klasy na generyczną, a dokładniej referencją do niej metody.
Jako dodatek, ale nie jest to dla mnie wymagane fajnie by było, gdyby była możliwość przypisania referencji do metody na podstawie klasy, czyli :
Podajemy jako parametr klasa1 i jest tutaj np refleksja(tak to się chyba nazywa) MetodaKlasa1Metoda.
Chyba, że całkowicie inaczej powinienem to zrobić, bo się inaczej do tego zabieram.
Poniżej kod, jak to wygląda, a problem leży w implementacji generyka w klasie GetQueryUserDetailService
public abstract class GetQueryAbstractService<B, R> {
@PersistenceContext
protected EntityManager entityManager;
protected abstract Class<B> getClazz();
protected abstract Predicate getPredicate(Predicate predicate, CriteriaBuilder builder, Root r, List<SearchCriteria> params);
protected abstract List<R> getDtos(CriteriaQuery<B> query);
public List<R> execute(String search) {
final CriteriaBuilder builder = entityManager.getCriteriaBuilder();
final CriteriaQuery<B> query = builder.createQuery(getClazz());
final Root r = query.from(getClazz());
List<SearchCriteria> params = new ArrayList<>();
if (search != null) {
Pattern pattern = Pattern.compile("(\\w+?)(:|<|>)(\\w+?),");
Matcher matcher = pattern.matcher(search + ",");
while (matcher.find()) {
params.add(new SearchCriteria(matcher.group(1), matcher.group(2), matcher.group(3)));
}
}
Predicate predicate = builder.conjunction();
predicate = getPredicate(predicate, builder, r, params);
query.where(predicate);
return getDtos(query);
}
}
@Service
public class GetQueryUserDetailService extends GetQueryAbstractService<UserDetail, UserDetail.UserDetailDto> {
@Override
protected Class<UserDetail> getClazz() {
return UserDetail.class;
}
@Override
protected Predicate getPredicate(Predicate predicate, CriteriaBuilder builder, Root r, List<SearchCriteria> params) {
UserSearchQueryCriteriaConsumer searchConsumer = new UserSearchQueryCriteriaConsumer(predicate, builder, r);
params.forEach(searchConsumer);
return searchConsumer.getPredicate();
}
@Override
protected List<UserDetail.UserDetailDto> getDtos(CriteriaQuery<UserDetail> query) {
return entityManager
.createQuery(query)
.getResultStream()
.map(UserDetail::toUserDetailDto)
.collect(Collectors.toList());
}
}
Mam problem z : map(UserDetail::toUserDetailDto) , chyba że to nie działa, bo źle podaję genęryki.
Oczywiście, żeby kod był sprawny, to nie implementowałem powyżej wartości generycznych, żeby nie zrobić burdelu w kodzie.
Za pomoc/ wskazówki z góry dziękuje.