我有以下课程
@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的正确方法是什么?
答案 0 :(得分:1)
从JPA 2.0 specification开始,它使用single_valued_object_field
和collection_valued_field
分别代表单个实体字段和集合实体字段:
single_valued_object_field 由a的名称指定 一对一或多对一关系中的关联字段或 可嵌入类类型的领域。的类型 single_valued_object_field是相关的抽象模式类型 实体或可嵌入的类。
collection_valued_field 由关联名称指定 一对多或多对多关系中的字段或名称 元素集合字段。 collection_valued_field的类型 是相关的抽象模式类型的值的集合 实体或元素类型。
然后它定义SELECT子句具有以下语法:
constructor_expression :: = new constructor_name(constructor_item {,constructor_item} *)
constructor_item :: = single_valued_path_expression | scalar_expression | aggregate_expression | identification_variable
由于constructor_item
可以接受single_valued_path_expression
但不接受collection_valued_field
,我认为new()
不能接受收集字段参数。
您必须使用获取联接来检索User
实例及其Authority
集合,然后手动将其转换为myPkg.SimpleUser