私は現在、領域の列挙値のリストを含む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);
どのようにDBにリレーションシップを設定しましたか? – perissf
私はdbに関するいくつかのより多くの情報で質問を更新しました。 – Pumuckline
なぜ 'company2area'に 'area'ではなく' areas'フィールドがありますか?それはエリア名の(コンマ区切りの)リストを含んでいますか? – perissf