2017-02-03 25 views
6

मैं पूछना चाहता हूं कि सूची विशेषता वाले वर्ग के लिए उदाहरण मैटर का उपयोग कैसे करें। आइए मान लें, हमारे पास एक उपयोगकर्ता है जिसमें एक ही समय में कई भूमिकाएं हो सकती हैं। मैं सूची विशेषता के लिए वसंत डेटा उदाहरण मैचर का उपयोग कैसे करें - क्वेरी समस्या

संस्थाओं

@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; 
} 

डीबी

से उपयोगकर्ता भूमिका के साथ सभी उपयोगकर्ताओं प्राप्त करना चाहते हैं मैं getExampleEntity करने के लिए कुछ विशेषताओं के साथ एक उपयोगकर्ता वर्ग भेजें। मैं अब यूआई से चयनित भूमिकाओं की सूची भेजने की कोशिश कर रहा हूं।

नियंत्रक में समारोह

@Override 
    protected User getExampleEntity() { 
     User clonedUser = new User(); 
     List<UserRole> selectedRole = new ArrayList<>(); 

// इस चक्र बस खोजने के लिए और DB में सभी भूमिकाओं के लिए यूआई से चयन के आधार पर जोड़ने (लांग भूमिका-आईडी: selectedUserRoleIDs) selectedRole.add (userRoleService.find (भूमिका-आईडी)); clonedUser.setRoles (चयनित रोल); रिटर्न क्लोन यूज़र; }

जेपीआर रिपोजिटरी से फ़ंक्शन, जिसे कॉल करें उदाहरण उदाहरण मैचर के साथ ByExample फ़ंक्शन।

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

    } 

यह एक सपने के रूप में काम करता है विशेषता नाम/उपनाम या पता कक्षा में भी किसी भी विशेषता के साथ एक उपयोगकर्ता भेजेगा कि है, लेकिन यह सूची भूमिकाओं के साथ काम नहीं करता। मैं इस समस्या को हल करने के तरीके और किसी विशेषता के रूप में TObjectType की सरणी के साथ findByExample का उपयोग कैसे कर सकता हूं, इस बारे में किसी भी सुझाव की सराहना करता हूं। आपको बहुत धन्यवाद

संपादित करें: मुझे समस्या मिली। वहाँ 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); 
    } 

जनरेट किया क्वेरी सूची विशेषता शामिल नहीं है, लेकिन मुझे पता नहीं क्यों और इसके बारे में शामिल किया गया है है उदाहरण वस्तु। क्या किसी ने इस समस्या का अनुभव किया है? मुझे लगता है कि केवल कुछ सेटिंग/एनोटेशन समस्या है।

+1

मेरे पास आपके जैसा ही प्रश्न है। मैंने प्रलेखन में देखा था हालांकि यह कहता है [लिंक] (http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#query-by-example.execution) केवल सिंगुलरएट्रिब्यूट गुण वर्तमान में संपत्ति मिलान के लिए इस्तेमाल किया जाना चाहिए। मैंने सिंगुलरएट्रिब्यूट गुणों का शोध करने की कोशिश की लेकिन मैंने सोचा कि शायद सूची को छोड़कर संदर्भित किया जा सकता है ... – ejgreenwald

+0

क्या आपको इस समस्या का समाधान मिला ?! आपका प्रश्न स्पॉट पर है, और मैं वास्तव में आपके द्वारा किए गए कार्यों में रूचि रखता हूं। – Thodoris

उत्तर

0

आपको पहले ट्रांसफॉर्मर का उपयोग करने का प्रयास करना चाहिए। नीचे उदाहरण मोंगोब के लिए है, लेकिन आप दृष्टिकोण देख सकते हैं। मेरे मामले में उपयोगकर्ता श्रेणी में तारों की सूची स्ट्रिंग्स के रूप में होती है:

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); 
संबंधित मुद्दे