2015-09-09 22 views
1

我搜索了这个,但无法更正我的查询。需要帮助。这里是我的VU360User获取错误非法尝试取消引用集合[vu360user0_.id.lmsRoles]元素属性参考[lmsRoleLmsFeature]

@Entity 
public class VU360User extends AuditedEntity implements UserDetails, CredentialsContainer, Cloneable { 
    ... 
    private Learner learner; 
    private Set<LmsRole> lmsRoles; 
    ... 

    @OneToOne(mappedBy = "vu360User", fetch=FetchType.LAZY) 
    public Learner getLearner() { 
     return learner; 
    } 
    //Setter 

    @ManyToMany(fetch=FetchType.LAZY) 
    @JoinTable(
     name = "VU360USER_ROLE", 
     joinColumns = { 
      @JoinColumn(name = "USER_ID", referencedColumnName = "ID") 
     }, 
     inverseJoinColumns = { 
      @JoinColumn(name = "ROLE_ID", referencedColumnName = "ID") 
     } 
    ) 
    public Set<LmsRole> getLmsRoles() { 
     return lmsRoles; 
    } 
    //Setter 

} 

这里是我LmsRole类

@Entity 
public class LmsRole extends BaseEntity implements GrantedAuthority { 
    .... 
    private List<LmsRoleLmsFeature> lmsRoleLmsFeature; 

    @OneToMany(mappedBy = "lmsRole", fetch=FetchType.LAZY) 
    public List<LmsRoleLmsFeature> getLmsRoleLmsFeature() { 
     return lmsRoleLmsFeature; 
    } 

    public void setLmsRoleLmsFeature(List<LmsRoleLmsFeature> lmsRoleLmsFeature) { 
     this.lmsRoleLmsFeature = lmsRoleLmsFeature; 
    } 
    ... 
} 

这里是我的LmsRoleLmsFeature类

@Entity 
public class LmsRoleLmsFeature extends BaseEntity implements Serializable{ 
    ... 
    private LmsRole lmsRole; 
    private LmsFeature lmsFeature; 

    @ManyToOne(fetch=FetchType.LAZY) 
    @JoinColumn(name="LMSROLE_ID") 
    public LmsRole getLmsRole() { 
     return lmsRole; 
    } 

    @ManyToOne(fetch=FetchType.LAZY) 
    @JoinColumn(name="LMSFEATURE_ID") 
    public LmsFeature getLmsFeature() { 
     return lmsFeature; 
    } 
    ... 
} 

现在,这里是我试图让,但得到的异常

查询
@Query("select distinct u, l, c, d, ta, la, p, ra, i from #{#entityName} u, IN (u.lmsRoles) lr " 
     + "join fetch u.learner l " 
     + "join fetch l.customer c " 
     + "join fetch c.distributor d " 
     + "join fetch u.trainingAdministrator ta " 
     + "join fetch u.lmsAdministrator la " 
     + "join fetch u.proctor p " 
     + "join fetch u.regulatoryAnalyst ra " 
     + "join fetch u.instructor i " 
     + "join u.lmsRoles.lmsRoleLmsFeature lrlf " 
     //+ "join lr.lmsRoleLmsFeature lrlf " 
     + "where u.username = :userName and c.activeTf = true and d.status = true") 
VU360User findByUserNameWithAllEntitiesAssociations(@Param("userName")String userName); 

我得到以下例外

Caused by: org.hibernate.QueryException: illegal attempt to dereference collection [vu360user0_.id.lmsRoles] with element property reference [lmsRoleLmsFeature] 

我试过连接,但我无法做到。我尝试了不同的设置,但无法解决它。请帮忙。

感谢

回答

0

vu360user0_.id.lmsRoles是一个集合。因此,it does not have an attribute名为lmsRoleLmsFeature

你不能做一个join u.lmsRoles.lmsRoleLmsFeature lrlf与表达中的集合(lmsRoles),但你可以在一个新的JOIN操作拆分此:

join u.lmsRoles lmsRoles 
join lmsRoles.lmsRoleLmsFeature lrlf 

所以,你需要重写youy JPQL,像这个:

@Query("select distinct u, l, c, d, ta, la, p, ra, i from #{#entityName} u, IN (u.lmsRoles) lr " 
     + "join fetch u.learner l " 
     + "join fetch l.customer c " 
     + "join fetch c.distributor d " 
     + "join fetch u.trainingAdministrator ta " 
     + "join fetch u.lmsAdministrator la " 
     + "join fetch u.proctor p " 
     + "join fetch u.regulatoryAnalyst ra " 
     + "join fetch u.instructor i " 
     + "join fetch u.instructor i " 
     + "join u.lmsRoles lmsRoles" 
     + "join lmsRoles.lmsRoleLmsFeature lrlf" 
     + "where u.username = :userName and c.activeTf = true and d.status = true") 
VU360User findByUserNameWithAllEntitiesAssociations(@Param("userName")String userName); 

并且要小心这个数量JOIN FETCH。这将在结果中产生大量重复信息的大查询。

相关问题