@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.
List<R>