Критерий Query: как отсортировать по значению в коллекции карт? - PullRequest
0 голосов
/ 12 октября 2011

Я не могу найти пример того, как это сделать, поэтому любая помощь будет оценена.

Моя схема имеет объект, который выглядит следующим образом:

@Entity
public class User implements Serializable {

  @Id private Integer id;

  private String handle;

  @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true)
  @MapKey(name = "udkey")
  private Map<String, UserData>   attrs;

  // rest of stuff omitted 
}

и ссылка на сущность как:

@Entity
public class UserData implements Serializable {

  @Id private Integer id;

  private String udKey;

  private String udData;

  // rest of stuff omitted

}

Таким образом, карта имеет переменное количество атрибутов данных, связанных с данным пользователем, например:

udKey       udData
"email"     "john.q.public@gmail.com"
"realname"  "john public"
"dob"       "1960/01/30"

(для ключей я фактически использую объекты enum, но я пытаюсь упростить этот пример.)

Вопрос в том, как отсортировать таблицу пользователей по (например) адресу электронной почты в запросе критериев? Я думаю, что я начинаю следующим образом:

    CriteriaBuilder builder = em.getCriteriaBuilder();
    CriteriaQuery<User> query = builder.createQuery(User.class);
    Root<User> root = query.from(User.class);

    MapJoin<User, String, UserData> join = root.join(User_.attrs);

    Expression exp =  // what goes here?

    query.orderBy(builder.asc(exp));

Надеюсь, это достаточно ясно. Я предполагаю, что общий вопрос заключается в том, как мне построить путь на карту с помощью буквального ключа (в данном случае «email»). Еще раз спасибо за любую помощь.

1 Ответ

1 голос
/ 12 октября 2011

Вам нужно будет сделать заказ по udData, но поскольку это OneToMany, вам нужно будет отфильтровать электронную почту в предложении where. Если у какого-либо пользователя нет адреса электронной почты, вам потребуется внешнее присоединение.

Если вам нужно сделать заказ по нескольким клавишам, вам нужно иметь несколько соединений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...