【问题标题】:getting Caused by: org.hibernate.QueryException: cannot dereference scalar collection element: roles引起:org.hibernate.QueryException:无法取消引用标量集合元素:角色
【发布时间】:2020-07-23 12:03:27
【问题描述】:

我有这门课,我正在尝试从用户表中访问 mobileNumbersroles,但是被 lazy 初始化后,我不断收到 'lazy intialization error

我不想删除LAZY fetch,因为很少需要完全访问该对象,但这是必需的。所以为了克服它,我首先尝试添加@Transactional,但通过这篇文章https://codete.com/blog/5-common-spring-transactional-pitfalls/,在我的情况下这似乎是一个糟糕的方法,我尝试使用join fetch,但它一直给multiplebagfetchexception,因此我试图获取它们一次(我的意思是元素集合)

使用这个存储库类

public interface UserRespository extends JpaRepository<UserDao, Long> {

    Optional<UserDao> getByUserNameIgnoreCase(String userName);
//    Optional<UserDao> findByUserNameIgnoreCase(String userName);

    @Query(value = "select dao.roles.roles from UserDao dao inner join dao.roles r on dao.userName in elements(r.userName) and upper(dao.userName) = upper(?1)")
    Object getByUserNameIgnoreCaseComplete2(String userName);
}

然后我得到他的错误

Caused by: org.hibernate.QueryException: cannot dereference scalar collection element: roles
    at org.hibernate.persister.collection.ElementPropertyMapping.toType(ElementPropertyMapping.java:33) ~[hibernate-core-5.3.9.Final.jar:5.3.9.Final]
    at org.hibernate.persister.collection.AbstractCollectionPersister.toType(AbstractCollectionPersister.java:1644) ~[hibernate-core-5.3.9.Final.jar:5.3.9.Final]
    at org.hibernate.hql.internal.ast.tree.FromElementType.getPropertyType(FromElementType.java:396) ~[hibernate-core-5.3.9.Final.jar:5.3.9.Final]
    at org.hibernate.hql.internal.ast.tree.FromElement.getPropertyType(FromElement.java:515) ~[hibernate-core-5.3.9.Final.jar:5.3.9.Final]
    at org.hibernate.hql.internal.ast.tree.DotNode.getDataType(DotNode.java:682) ~[hibernate-core-5.3.9.Final.jar:5.3.9.Final]
    at org.hibernate.hql.internal.ast.tree.DotNode.prepareLhs(DotNode.java:265) ~[hibernate-core-5.3.9.Final.jar:5.3.9.Final]
    at org.hibernate.hql.internal.ast.tree.DotNode.resolve(DotNode.java:205) ~[hibernate-core-5.3.9.Final.jar:5.3.9.Final]
    at org.hibernate.hql.internal.ast.tree.FromReferenceNode.resolve(FromReferenceNode.java:114) ~[hibernate-core-5.3.9.Final.jar:5.3.9.Final]
    at org.hibernate.hql.internal.ast.tree.FromReferenceNode.resolve(FromReferenceNode.java:109) ~[hibernate-core-5.3.9.Final.jar:5.3.9.Final]
    at org.hibernate.hql.internal.ast.tree.FromReferenceNode.resolve(FromReferenceNode.java:104) ~[hibernate-core-5.3.9.Final.jar:5.3.9.Final]
    at org.hibernate.hql.internal.ast.tree.DotNode.resolveSelectExpression(DotNode.java:744) ~[hibernate-core-5.3.9.Final.jar:5.3.9.Final]
    at org.hibernate.hql.internal.ast.HqlSqlWalker.resolveSelectExpression(HqlSqlWalker.java:1057) ~[hibernate-core-5.3.9.Final.jar:5.3.9.Final]
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectExpr(HqlSqlBaseWalker.java:2295) ~[hibernate-core-5.3.9.Final.jar:5.3.9.Final]
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectExprList(HqlSqlBaseWalker.java:2232) ~[hibernate-core-5.3.9.Final.jar:5.3.9.Final]
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectClause(HqlSqlBaseWalker.java:1503) ~[hibernate-core-5.3.9.Final.jar:5.3.9.Final]
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:585) ~[hibernate-core-5.3.9.Final.jar:5.3.9.Final]
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:313) ~[hibernate-core-5.3.9.Final.jar:5.3.9.Final]
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:261) ~[hibernate-core-5.3.9.Final.jar:5.3.9.Final]
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:271) ~[hibernate-core-5.3.9.Final.jar:5.3.9.Final]
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:191) ~[hibernate-core-5.3.9.Final.jar:5.3.9.Final]
    ... 112 common frames omitted

我不知道为什么我一直收到这个错误。有没有其他方法可以获得整个对象??

请帮忙。

实际类

@Entity
@Table(name = "users")
@Data
@NoArgsConstructor
public class UserDao implements Serializable {

    @Id
    @GeneratedValue
    private long id;

    @Column(name = "user_name", nullable = false, unique = true)
    private String userName;

    @Column(name = "password", nullable = false)
    private String password;

    @ElementCollection(targetClass = java.lang.String.class)
    @CollectionTable(name = "mobile_numbers_List",joinColumns = @JoinColumn(name = "user_name",referencedColumnName = "user_name"))
    @Column(name = "mobile_number")
    private List<String> mobileNumbers;

    @ElementCollection(targetClass = java.lang.String.class)
    @CollectionTable(name = "roles_list",joinColumns = @JoinColumn(name = "user_name",referencedColumnName = "user_name"))
    @Column(name = "roles")
    private List<String> roles;
}

【问题讨论】:

    标签: spring-boot hibernate spring-data-jpa


    【解决方案1】:

    这个问题好像你previous questio的问题,上一个和这个的答案是一样的。

    您的查询在这里是错误的

        @Query(value = "select dao.roles.roles from UserDao dao inner join dao.roles r on dao.userName in elements(r.userName) and upper(dao.userName) = upper(?1)")
        Object getByUserNameIgnoreCaseComplete2(String userName);
    

    它正在尝试获取 dao.roles.roles,如果它甚至不存在。

    这里有一些你应该尝试的改变

    1. dao.roles.roles改成r(因为你已经创建了别名,让我们使用它)
    2. 删除dao.userName in elements(r.userName) 不是必需的,spring 会自动执行此操作,甚至无需指定它。
    3. 将返回类型更改为 list ,它是 ElementCollectionCollection 元素

    这就是您的最终查询的样子

        @Query(value = "select r from UserDao dao inner join dao.roles r on upper(dao.userName) = upper(?1)")
        List<String> getByUserNameIgnoreCaseComplete2(String userName);
    

    【讨论】:

      【解决方案2】:

      你为什么要评论 findByUserNameIgnoreCasefindBy为我工作 Take a peek in this page

      【讨论】:

      【解决方案3】:

      问题是您查询中的dao.roles.roles。将其更改为dao.rolesdao.roles 在您的情况下是 List&lt;String&gt;String 没有属性 roles

      【讨论】:

      • 得到这个Caused by: org.hibernate.QueryException: not an entity
      猜你喜欢
      • 2020-04-17
      • 2014-09-05
      • 1970-01-01
      • 2021-07-10
      • 2015-11-27
      • 2015-09-22
      • 1970-01-01
      • 1970-01-01
      • 2015-12-05
      相关资源
      最近更新 更多