Referencja do metody w klasie generycznej.

Referencja do metody w klasie generycznej.
Nowak Adam
  • Rejestracja:ponad 4 lata
  • Ostatnio:prawie 4 lata
  • Postów:18
0

@TomRiddle:

O tyle co wstępne założenie chyba rozumiem, ale pozostaje kwestia , że TempGetQueryUserDetailService dalej przyjmuje UserDetail i UserDetailDto
Mam:

Kopiuj
        List<?> cos =  quer.execute(UserDetail.class, UserDetail.UserDetailDto.class, search, UserDetail -> new UserDetail.UserDetailDto());

I leci Error:
encja: Required type: UserDetail Provided:Class<pl.createcompetition.model.UserDetail>
dto:: Required : UserDetailDto Provided:Class<pl.createcompetition.model.UserDetail.UserDetailDto>

Mam:

Kopiuj
public List<?> execute(B encja, R dto, String search, Function<B, R> mapper) {
Riddle
Pokaż dokładne miejsce w którym jest ten błąd. Najlepiej screena
Nowak Adam
  • Rejestracja:ponad 4 lata
  • Ostatnio:prawie 4 lata
  • Postów:18
0

screenshot-20201114133426.png

Zmieniłem na:

Kopiuj
    public List<R> execute(B encja, R dto, String search, Function<B, R> mapper) {

Idę teraz afk, będę za 3h

edytowany 1x, ostatnio: Nowak Adam
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 16 godzin
  • Lokalizacja:Laska, z Polski
  • Postów:10076
0

@Nowak Adam: W deklaracji klasy GetQueryAbstractService powinno być

Kopiuj
public List<R> execute(String search, Class<B> encja, Function<B, R> mapper) 

UserDetailsDto w deklaracji funkcji jest niepotrzebne.

Nowak Adam
  • Rejestracja:ponad 4 lata
  • Ostatnio:prawie 4 lata
  • Postów:18
0

@TomRiddle
Dzięki za aktywność, ale dalej mi coś nie działa

Nie wiedzieć, czemu zwraca mi puste wartości w stylu:
{
"city": null,
"age": 0,
"gender": null
}

Sprawdzisz, czy to dobrze zaimplementowałem? (Uprzedzam, że staram się to naprawić i nie patrzyłem na optymalizację kodu, z racji tego, że mi nie działa i zrobiłby się zbyt duży kocioł

Mam interfejs:

Kopiuj
public interface Intt<B> {
    B map();
}

Encja tak wygląda:

Kopiuj
public class UserDetail implements Intt<UserDetail.UserDetailDto>
    @Override
    public UserDetailDto map() {
        return new UserDetailDto();
    }

Klasa abstrakcyjna:

Kopiuj
public abstract class TempGetQueryAbstractService<B extends Intt<R>, R> {

    @PersistenceContext
    protected EntityManager entityManager;

    protected abstract Predicate getPredicate(Predicate predicate, CriteriaBuilder builder, Root r, List<SearchCriteria> params);

    //protected abstract List<R> getList(CriteriaQuery<B> query);

    public List<R> execute(Class<B> encja, String search, Function<B, R> mapper) {
        final CriteriaBuilder builder = entityManager.getCriteriaBuilder();
        final CriteriaQuery<B> query = builder.createQuery(encja);
        final Root r = query.from(encja);


        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);

        var mapperFirst = new Mapper<B, R>();
        
        return mapperFirst.map(entityManager
                .createQuery(query)
                .getResultStream()
                .collect(Collectors.toList()));

    }
    static class Mapper<A extends Intt<B>, B> {
        public List<B> map(List<A> from) {
            return from.stream()
                    .map(Intt::map)
                    .collect(toList());
        }
    }
}

I jej implementacja, ale to muszę zmienić

Kopiuj
public class TempGetQueryUserDetailService extends TempGetQueryAbstractService<UserDetail, UserDetail.UserDetailDto> {

    @Override
    public  Predicate getPredicate(Predicate predicate, CriteriaBuilder builder, Root r, List<SearchCriteria> params) {
        UserSearchQueryCriteriaConsumer searchConsumer = new UserSearchQueryCriteriaConsumer(predicate, builder, r);
        params.forEach(searchConsumer);
        return searchConsumer.getPredicate();
    }
}

Byłbym wdzięczny za pomoc.

edytowany 1x, ostatnio: Nowak Adam
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 16 godzin
  • Lokalizacja:Laska, z Polski
  • Postów:10076
1

No pewnie dlatego że w UserDetails tworzysz dto, i nie przekazujesz do niego parametrów

Nowak Adam
  • Rejestracja:ponad 4 lata
  • Ostatnio:prawie 4 lata
  • Postów:18
0

@TomRiddle:
Dzięki, faktycznie nie zauważyłem. Teraz wszystko działa.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.