Criteria Query:如何对Map集合中的值进行排序?

时间:2011-10-12 04:44:46

标签: jpa jpa-2.0

我似乎无法找到如何执行此操作的示例,因此我们将不胜感激。

我的架构有一个如下所示的对象:

@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”)构建到地图的路径。再次感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

您需要通过udData订购,但由于它是OneToMany,您需要在where子句中过滤掉电子邮件。如果某个用户没有电子邮件,则需要外连接。

如果您需要按多个键排序,则需要有多个连接。