无法将状态字段路径解析为集合类型

时间:2015-11-24 11:57:52

标签: jpa eclipselink jpql

在我的实体模式中,我在UserUserGroup之间存在ManyToMany关系 用户是常见的@Entity类,而UserGroup是Java enum

映射看起来像这样:

@ElementCollection(targetClass = my.package.UserRight.class, fetch = FetchType.EAGER)
@Enumerated(EnumType.STRING)    
@CollectionTable(name = "MD_USER_RIGHTS", joinColumns = @JoinColumn(name = "REF_USER_ID"))
@Column(name = "USER_GROUP")
@Getter @Setter private Set<UserRight> userGroups;

除非我尝试通过JPQL访问userGroups集,否则一切正常。我不想将用户实体的所有信息暴露给下一层,所以我写了一个简单的JPQL查询来从我的用户实体创建一些DTO:

简化为:

public List<UserDTO> findAllActive() {
    Query q = em.createQuery("SELECT NEW my.package.UserDTO(m.name, m.id, m.userGroups) 
                              FROM User m ");
    return q.getResultList();
}

这会导致以下错误:

Exception [EclipseLink-0] (Eclipse Persistence Services - 2.6.0.v20150309-bf26070): org.eclipse.persistence.exceptions.JPQLException
Exception Description: Problem compiling [SELECT NEW my.package.UserDTO(m.name, m.id, m.userGroups) FROM User m]. 
[83, 95] The state field path 'm.userGroups' cannot be resolved to a collection type.

您能否告诉我我的代码有什么问题以及如何修复它?

1 个答案:

答案 0 :(得分:3)

通过此

为JPQL语法定义了构造函数表达式
constructor_item ::= single_valued_path_expression | scalar_expression | aggregate_expression | identification_variable

您不能将多值路径表达式(集合)作为JPQL中构造函数的输入arg。 不知道EclipseLink消息试图说什么,介意