【问题标题】:How to query for a M:N relationship using enums with CriteriaBuilder如何使用带有 CriteriaBuilder 的枚举查询 M:N 关系
【发布时间】:2012-10-18 21:40:00
【问题描述】:

我目前正在研究一个包含区域枚举值列表的公司实体。这些是公司正在工作的领域。它们被映射为@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

我做错了什么?枚举有什么特别的技巧吗?

我很清楚几个月前我问过的问题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);

【问题讨论】:

  • 你是如何在数据库中建立关系的?
  • 我用有关数据库的更多信息更新了我的问题。
  • 为什么company2area 中有areas 字段而不是area?它是否包含(逗号分隔的)区域名称列表?
  • 字段名是自动生成的。但是,该字段本身每个条目仅包含一个区域。表示一个公司的多个领域的多个条目。

标签: hibernate jpa-2.0 criteria-api


【解决方案1】:

如果我明确加入表格,它会起作用:

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

据我所知,这两种方式都应该产生相同的查询,因为内部连接是默认的,但显然,这里只有这个有效。

【讨论】:

  • 我观察到同样的问题,对于 jql 也有同样的“解决方案”。
猜你喜欢
  • 2017-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-21
  • 2020-11-19
  • 2013-05-28
  • 2013-02-14
  • 2020-07-19
相关资源
最近更新 更多