2017-02-03 21 views
6

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ą.

+1

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

+0

Czy znalazłeś rozwiązanie tego problemu ?! Twoje pytanie jest na miejscu i jestem naprawdę zainteresowany tym, co naprawdę zrobiłeś. – Thodoris

Odpowiedz

0

Powinieneś najpierw spróbować użyć transformatora. Przykład poniżej dotyczy Mongodb, ale widać podejście. W moim przypadku Klasa użytkownika zawiera listę ról jako ciągi:

final ExampleMatcher matcher = ExampleMatcher.matching() 
       .withIgnoreNullValues() 
       .withMatcher("roles", match -> match.transform(source -> ((BasicDBList) source).iterator().next()).caseSensitive()); 

     users = userRepository.findAll(Example.of(criteria, matcher), pageRequest); 
Powiązane problemy