【问题标题】:The state field path cannot be resolved to a collection type状态字段路径无法解析为集合类型
【发布时间】:2016-02-26 20:40:13
【问题描述】:

在我的实体模型中,UserUserGroup 之间存在多对多关系 User 是一个普通的@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 设置的用户组,否则一切正常。我不想将来自用户实体的所有信息暴露给下一层,所以我编写了一个简单的 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.

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

【问题讨论】:

    标签: jpa eclipselink jpql


    【解决方案1】:

    JPQL 语法已经足够好地被 this 定义为构造函数表达式了

    constructor_item ::= single_valued_path_expression | scalar_expression | aggregate_expression | identification_variable
    

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

    【讨论】:

    • 我了解...但是您是否也建议我如何获得预期的结果?应该在一个查询中完成,而不是 N+1
    • 显然您可以使用 JOIN 对元素进行查询,并返回该数据(单个 SQL),然后在您自己的代码中重新构建集合。不完美,但会工作
    猜你喜欢
    • 1970-01-01
    • 2013-12-02
    • 2015-04-15
    • 2017-08-25
    • 2015-04-21
    • 2014-03-07
    • 1970-01-01
    • 2023-01-02
    • 2015-09-16
    相关资源
    最近更新 更多