критерии api set предикат в котором пункт для MapJoin - PullRequest
0 голосов
/ 05 февраля 2012

У меня возникли проблемы с установкой предложения where следующего запроса:

CriteriaBuilder cb = em.getCriteriaBuilder();
  CriteriaQuery<Configuration> cq = cb.createQuery(Configuration.class);
  Root<Configuration> conf = cq.from(Configuration.class);
  MapJoin<Configuration, String, Component> mapJoin = conf.join(Configuration_.components, JoinType.LEFT); 
  cq.where(cb.and(cb.like(mapJoin.key(), "%abc%"), 
             cb.like(mapJoin.value().get(Component_.displayName), "%def%")));
  cq.select(pc);

Я в основном пытаюсь получить все конфигурации, содержащие запись в компонентах-карте, ключ которой содержит«abc» и значение которого содержит «def».Я ожидал, что это сработает, основываясь на примере кода из http://blogs.oracle.com/ldemichiel/entry/java_persistence_2_0_proposed, раздела Maps, но, видимо, я что-то упустил.

Сущности имеют следующую структуру:

@Entity
public class Configuration{
  @Id
  protected Long id;       
  @OneToMany
   protected Map<String, Component> components;
}

и

@Entity
public class Component{
    @Id
    protected Long id;    
    protected String displayName;
}

Заранее спасибо, любая помощь приветствуется.

1 Ответ

1 голос
/ 06 февраля 2012

Какую ошибку вы получаете?

Ваш код не имеет смысла.По умолчанию в JPA предполагается, что ключ карты исходит от целевого объекта, и если вы не установите целевое поле для использования с ключом, используя @MapKey, то по умолчанию предполагается, что это идентификатор объекта.В этом случае ваш ключ - String, а Id - Long, поэтому я не вижу, чтобы это работало вообще?

Вам нужно указать @MayKey или @MapKeyColumn для независимого хранения ключа вприсоединиться к столу.

...