2012-10-29 9 views
5

私は現在、領域の列挙値のリストを含むCompanyエンティティで作業しています。これらは、会社が取り組んでいる分野です。@ElementCollectionとしてマップされています。CriteriaBuilderで列挙型を使用してM:Nの関係をクエリする方法

@Entity 
public class Company { 

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

    ... 
} 

領域は、使用可能な領域を含む単純な列挙型です。

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 

私は何間違っている?列挙型について特別なトリックがありますか?

私は数ヶ月前に質問したHow to query an M:N relationship with JPA2?の質問に十分に気付いています。残念ながら、そこからのソリューションは列挙型では機能しません。

ありがとうございました。 :)

編集:

ここに私の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

どのようにDBにリレーションシップを設定しましたか? – perissf

+0

私はdbに関するいくつかのより多くの情報で質問を更新しました。 – Pumuckline

+0

なぜ 'company2area'に 'area'ではなく' areas'フィールドがありますか?それはエリア名の(コンマ区切りの)リストを含んでいますか? – perissf

答えて

2

それは動作しますが、私は明示的にテーブルを結合する場合:

私は思っ限り
query.where(query.from(Company.class) 
    .join("areas", JoinType.INNER) 
    .in(Arrays.asList(Area.ASIA, Area.AMERICA))); 

、どちらの方法でも、内部結合がデフォルトのものと同じクエリになるはずですが、明らかにここのものだけが動作します。

+0

同じ問題があり、jqlと同じ "解決策"がありました。 – Ralph

関連する問題