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)));