我似乎无法找到如何执行此操作的示例,因此我们将不胜感激。
我的架构有一个如下所示的对象:
@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"
(对于我实际使用枚举对象的键,但我试图简化这个例子。)
问题是如何在(例如)条件查询中的电子邮件地址上对User表进行排序?我想我的开头如下:
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”)构建到地图的路径。再次感谢您的帮助。
答案 0 :(得分:1)
您需要通过udData订购,但由于它是OneToMany,您需要在where子句中过滤掉电子邮件。如果某个用户没有电子邮件,则需要外连接。
如果您需要按多个键排序,则需要有多个连接。