Chciałbym zapytać, jak używać klasy exampleMatcher dla klasy z atrybutem listy. Załóżmy, że mamy użytkownika, który może mieć wiele ról w tym samym czasie. Chcę, aby wszystkie użytkownikom roli użytkownika z DBjak używać matcher sprężyny przykład matcher dla atrybutu listy - pytanie kwerendy
podmioty
@Entity(name = "UserEntity")
public class User {
Private Long id;
private String name;
private String surname;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn
private Address address;
@ManyToMany(cascade = CascadeType.MERGE, fetch = FetchType.EAGER)
@JoinColumn
private List<UserRole> roles;
}
@Entity
public class UserRole {
private Long id;
private String name;
}
wyślę klasę użytkownika z niektórych atrybutów getExampleEntity. Próbuję teraz wysłać listę wybranych ról z interfejsu użytkownika.
funkcja kontrolera
@Override
protected User getExampleEntity() {
User clonedUser = new User();
List<UserRole> selectedRole = new ArrayList<>();
// ten cykl po prostu znaleźć i dodać wszystkie role w dB na podstawie wyboru z UI dla (Długie RoleId: selectedUserRoleIDs) selectedRole.add (userRoleService.find (RoleId)); clonedUser.setRoles (selectedRole); return clonedUser; }
Funkcja od JpaRepository, która wywołuje funkcję findByExample z przykładem Matchera.
@Override
public List<TObjectType> findByExample(int first, int pageSize, String sortField, Sort.Direction sortOrder, TObjectType type)
{
PageRequest pageRequest = getPageRequest(first, pageSize, sortField, sortOrder);
ExampleMatcher exampleMatcher = getExampleMatcher();
Example<TObjectType> example = Example.of(type, exampleMatcher);
return repository.findAll(example, pageRequest).getContent();
}
/**
* Generates an example matcher for the instance of {@link TObjectType}.
* This can be overriden if a custom matcher is needed! The default property matcher ignores the "id" path and ignores null values.
* @return
*/
protected ExampleMatcher getExampleMatcher() {
return ExampleMatcher.matching()
.withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING)
.withIgnoreNullValues();
}
To działa jak sen jeśli wyśle Użytkownikowi nazwa atrybutu/nazwisko lub nawet jakiegokolwiek atrybutu w klasie adresowej, ale to nie działa z ról listy. Doceniam wszelkie wskazówki, jak rozwiązać ten problem i jak mogę użyć findByExample z tablicą TObjectType jako atrybut. Dziękuję bardzo
EDYCJA: Znalazłem problem. Jest to kod funkcji repository.findAll (org.springframework.data.repository.query.QueryByExampleExecutor # findAll)
@Override
public <S extends T> Page<S> findAll(Example<S> example, Pageable pageable) {
ExampleSpecification<S> spec = new ExampleSpecification<S>(example);
Class<S> probeType = example.getProbeType();
TypedQuery<S> query = getQuery(new ExampleSpecification<S>(example), probeType, pageable);
return pageable == null ? new PageImpl<S>(query.getResultList()) : readPage(query, probeType, pageable, spec);
}
Wygenerowane zapytanie nie zawiera atrybut listy, ale nie mam pojęcia, dlaczego i to jest wliczone w Przykład obiektu. Czy ktoś ma z tym problem? Domyślam się, że jest tylko problem z ustawieniem/adnotacją.
Mam takie samo pytanie jak Ty. Widziałem w dokumentacji, chociaż mówi [link] (http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#query-by-example.execution) Tylko właściwości SingularAttribute mogą obecnie używane do dopasowywania właściwości. Próbowałem dowiedzieć się, jakie właściwości SingularAttribute są, ale myślałem, że może to odnosić się do wykluczania list ... – ejgreenwald
Czy znalazłeś rozwiązanie tego problemu ?! Twoje pytanie jest na miejscu i jestem naprawdę zainteresowany tym, co naprawdę zrobiłeś. – Thodoris