0

我有以下课程

@NamedQueries({
        @NamedQuery(name = "User.FindByFilter", query = "SELECT NEW myPkg.SimpleUser(u.name , u.email, u.roles) FROM User u WHERE UPPER(u.name) LIKE :filter AND  ORDER BY u.name")
 })
@Entity
@Table(name = "Users")
public class User implements Serializable, UserDetails {
    @Id
    private String email;
    @Basic
    private String name;
    @OneToMany(cascade = { CascadeType.REFRESH, CascadeType.PERSIST }, fetch = FetchType.EAGER)
    private Set<Authority> roles;
...
}

@Entity
public class Authority implements GrantedAuthority {
//just @Id and @Basic here no specific mapping back to user
...
}

我当然知道这个查询

@NamedQuery(name = "User.FindByFilter", query = "SELECT NEW myPkg.SimpleUser(u.name , u.email, u.roles) FROM User u WHERE UPPER(u.name) LIKE :filter AND  ORDER BY u.name")

错了,因为u.roles@OneToMany
所以我的问题是将角色字段传递给const的正确方法是什么?

4

1 回答 1

1

JPA 2.0 规范中,它分别使用single_valued_object_fieldcollection_valued_field来表示单个实体字段和集合实体字段:

single_valued_object_field一对一多对一关系中的关联字段或可嵌入类类型的字段的名称指定。single_valued_object_field 的类型是相关实体或可嵌入类的抽象模式类型。

collection_valued_field由一对多多对多关系 中的关联字段的名称或元素集合字段的名称指定。collection_valued_field 的类型是相关实体或元素类型的抽象模式类型的值的集合。

然后它定义了 SELECT 子句,语法如下:

  • constructor_expression ::= 新的 constructor_name (constructor_item {, constructor_item}* )

  • constructor_item ::= single_valued_pa​​th_expression | 标量表达式 | 聚合表达式 | 识别变量

constructor_item可以接受single_valued_path_expression但不能接受,我collection_valued_field认为new()不能接受集合字段参数。

您必须使用 fetch 连接来检索User实例及其 Authority集合,然后手动将其转换为myPkg.SimpleUser

于 2012-12-28T05:12:42.710 回答