2012-10-29 27 views
5

के साथ enums का उपयोग कर एम: एन रिश्ते के लिए कैसे पूछें मैं एक कंपनी इकाई पर काम कर रहा हूं जिसमें एरिया मानों की सूची शामिल है। ये वे क्षेत्र हैं, कंपनी काम कर रही हैं। उन्हें @ElementCollection के रूप में मैप किया गया है।CriteriaBuilder

@Entity 
public class Company { 

    @ElementCollection 
    @CollectionTable(name = "company2area") 
    @Enumerated(EnumType.STRING) 
    private List<Area> areas = new ArrayList<Area>(); 

    ... 
} 

क्षेत्र एक सरल enum है, जिसमें उपलब्ध क्षेत्र हैं।

public enum Area { 
    ASIA, 
    AMERICA, 
    EUROPE; 
} 

मैं सभी कंपनियों है कि वर्तमान में इस तरह एशिया और अमेरिका में काम कर रहे हैं के लिए क्वेरी करने की कोशिश की:

CriteriaQuery<Company> query = this.entityManager.getCriteriaBuilder() 
              .createQuery(Company.class); 
query.where(query.from(Company.class) 
     .get("areas") 
     .in(Arrays.asList(Area.ASIA, Area.AMERICA))); 
List<Company> result = entityManager.createQuery(q) 
            .getResultList(); 

लेकिन सब मुझे मिल गया एक अपवाद है:

Caused by: java.lang.IllegalArgumentException: Parameter value [ASIA] 
did not match expected type [java.util.Collection] at 
org.hibernate.ejb.AbstractQueryImpl.validateParameterBinding(AbstractQueryImpl.java:375) 
    at 
org.hibernate.ejb.AbstractQueryImpl.registerParameterBinding(AbstractQueryImpl.java:348) 
    at org.hibernate.ejb.QueryImpl.setParameter(QueryImpl.java:375)  at 
org.hibernate.ejb.criteria.CriteriaQueryCompiler$1$1.bind(CriteriaQueryCompiler.java:195) 
    at 
org.hibernate.ejb.criteria.CriteriaQueryCompiler.compile(CriteriaQueryCompiler.java:241) 
    at 
org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:587) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597)  at 
org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:240) 
    at $Proxy61.createQuery(Unknown Source)  ... 29 more 

मैं क्या कर रहा हूँ गलत कर रहे हो क्या enums के बारे में एक विशेष चाल है?

मुझे कुछ महीने पहले पूछे गए प्रश्न How to query an M:N relationship with JPA2? के बारे में अच्छी तरह से पता है। दुर्भाग्य से, वहां से समाधान enums के साथ काम नहीं करता है।

आपकी मदद के लिए धन्यवाद। :)

संपादित करें:

यहाँ मेरी MySQL डेटाबेस का विवरण दिया गया है:

create table company2area (
    Company_fk bigint not null, 
    areas varchar(255) 
) ENGINE=InnoDB; 

create table company (
    id bigint not null auto_increment, 
    fullName varchar(255), 
    ..., 
    primary key (id) 
) ENGINE=InnoDB; 

alter table company2area 
    add index FK52BA7162CE087250 (Company_fk), 
    add constraint FK52BA7162CE087250 
    foreign key (Company_fk) 
    references company (id); 
+0

आपने डीबी में रिश्ते को कैसे स्थापित किया है? – perissf

+0

मैंने डीबी के बारे में कुछ और जानकारी के साथ अपना प्रश्न अपडेट किया। – Pumuckline

+0

'company2area' में' क्षेत्र' के बजाय आपके पास फ़ील्ड 'क्षेत्र' क्यों है? क्या इसमें क्षेत्र के नामों की एक (अल्पविराम से अलग) सूची है? – perissf

उत्तर

2

यह काम करता है, मैं स्पष्ट रूप से तालिकाओं में शामिल होने अगर:

query.where(query.from(Company.class) 
    .join("areas", JoinType.INNER) 
    .in(Arrays.asList(Area.ASIA, Area.AMERICA))); 

जहां तक ​​मैंने सोचा, दोनों तरीकों से एक ही प्रश्न में परिणाम होना चाहिए क्योंकि आंतरिक जुड़ना डिफ़ॉल्ट है, लेकिन जाहिर है, केवल यह यहां काम करता है।

+0

मैंने एक ही समस्या देखी, और jql के लिए एक ही "समाधान" देखा। – Ralph