将OneToMany传递给NEW-Statement构造函数

时间:2012-12-28 01:53:57

标签: java jpa jpql

我有以下课程

@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的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

JPA 2.0 specification开始,它使用single_valued_object_fieldcollection_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_pa​​th_expression | scalar_expression | aggregate_expression | identification_variable

  •   

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

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