Hibernate 如何使用带有CriteriaBuilder的枚举查询M:N关系

Hibernate 如何使用带有CriteriaBuilder的枚举查询M:N关系,hibernate,jpa-2.0,criteria-api,Hibernate,Jpa 2.0,Criteria Api,我目前正在处理一个包含区域枚举值列表的公司实体。这些都是公司工作的领域。它们被映射为@ElementCollection @Entity public class Company { @ElementCollection @CollectionTable(name = "company2area") @Enumerated(EnumType.STRING) private List<Area> areas = new ArrayList<Area>();

我目前正在处理一个包含区域枚举值列表的公司实体。这些都是公司工作的领域。它们被映射为
@ElementCollection

@Entity
public class Company {

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

  ...
}
我试图查询目前在亚洲和美国工作的所有公司,如下所示:

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();
我做错了什么?枚举有什么特别的技巧吗

我很清楚几个月前我提出的问题。不幸的是,这里的解决方案不适用于枚举

谢谢你的帮助。:)

编辑:

以下是我的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);

如果我显式地连接表,它会起作用:

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

就我所想,这两种方法都应该产生相同的查询,因为默认情况下内部连接是相同的,但显然,这里只有这一种有效

您是如何在数据库中设置关系的?我用有关数据库的更多信息更新了我的问题。为什么在
company2area
中有
area
字段而不是
area
?它是否包含区域名称(逗号分隔)列表?字段名称自动生成。但是,字段本身每个条目只包含一个区域。意味着一家公司的多个领域有多个条目。我观察到了相同的问题,jql也有相同的“解决方案”。
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);
query.where(query.from(Company.class)
    .join("areas", JoinType.INNER)
    .in(Arrays.asList(Area.ASIA, Area.AMERICA)));