6

私は現在、エリア列挙値のリストを含む会社エンティティに取り組んでいます。これらは会社が取り組んでいる分野です。これらはとしてマッピングされ@ElementCollectionます。

@Entity
public class Company {

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

  ...
}

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

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

JPA2とのM:N関係を照会する方法についての質問をよく知っています。数ヶ月前に聞いた。残念ながら、そこからのソリューションは列挙型では機能しません。

ご協力いただきありがとうございます。:)

編集:

これが私の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);
4

1 に答える 1

4

テーブルを明示的に結合すると、機能します。

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

私が思った限りでは、どちらの方法でも、内部結合がデフォルトであるのと同じクエリになるはずですが、明らかに、ここではこれだけが機能します。

于 2012-10-30T14:00:08.900 に答える