2

これを検索しましたが、クエリを修正できませんでした。これについて助けが必要です。これが私のVU360Userです

@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]

結合を試みましたが、結合できません。別の設定を試しましたが、解決できませんでした。助けてください。

ありがとう

4

1 に答える 1

0

vu360user0_.id.lmsRolesコレクションです。そのため、という名前の属性はありませんlmsRoleLmsFeature

join u.lmsRoles.lmsRoleLmsFeature lrlf式の中でコレクション ( ) を使用することはできませんが、lmsRolesこれを新しい JOIN 操作で分割できます。

join u.lmsRoles lmsRoles
join lmsRoles.lmsRoleLmsFeature lrlf

では、次のように 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ください。これにより、結果に多くの重複情報を含む大きなクエリが生成されます。

于 2015-11-23T14:25:29.910 に答える