Я не могу найти пример того, как это сделать, поэтому любая помощь будет оценена.
Моя схема имеет объект, который выглядит следующим образом:
@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»). Еще раз спасибо за любую помощь.