QueryDSL 集合包含

问题描述 投票:0回答:1

简单的 QueryDSL 代码,用于搜索具有特定单一角色的用户。 它在过去工作(版本

findByUserRole_1()
),现在升级到最新的 Hibernate 后出现异常。

问题:有没有办法修复 QueryDSL 代码以与新的 Hibernate 6 一起使用?

findByUserRole_1()

org.hibernate.query.SemanticException: Operand of 'member of' operator must be a plural path

findByUserRole_2() 备用

where
子句也会引发异常:

org.hibernate.query.QueryArgumentException: Argument [ROLE_ADMIN] of type [com.thevegcat.app.config.UserRole] did not match parameter type [java.util.Set (n/a)]

findByUserRole_3() 这个也曾经有效,现在抛出异常:

java.lang.ClassCastException: class org.hibernate.metamodel.mapping.internal.BasicAttributeMapping cannot be cast to class org.hibernate.sql.ast.tree.from.TableGroupJoinProducer (org.hibernate.metamodel.mapping.internal.BasicAttributeMapping and org.hibernate.sql.ast.tree.from.TableGroupJoinProducer are in unnamed module of loader 'app')

UserRole.java

public enum UserRole {
    ROLE_ADMIN,
    ROLE_ADVANCED,
    ROLE_EDITOR,
    ROLE_USER,
    ROLE_ANONYMOUS
}

用户.java

@Entity 
public class User {
    // ...

    @Convert(converter = UserRolesConverter.class)
    @Column(columnDefinition = "TEXT")
    private Set<UserRole> roles;

    // ...
}


UserRepositoryImpl.java

public class UserRepositoryImpl 
    // ...

    public List<User> findByUserRole_1( final UserRole userRole ) {
        final QUser user = QUser.user;
        return 
            new JPAQueryFactory(this.entityManager)
                .selectFrom(user)
                .where(
                    new BooleanBuilder().and(user.roles.contains(userRole)).getValue()
                )
                .fetch();
    }

    public List<User> findByUserRole_2( final UserRole userRole ) {
        final QUser user = QUser.user;
        return 
            new JPAQueryFactory(this.entityManager)
                .selectFrom(user)
                .where(
                    new BooleanBuilder().and(user.roles.any().eq(userRole)).getValue()
                )
                .fetch();
    }

    // ...
}

UserRepository.java

public interface UserRepository extends
    PagingAndSortingRepository<User, Integer>,
    CrudRepository<User, Integer>
{
    // ...

    @Query("SELECT u FROM User u LEFT JOIN FETCH u.roles r WHERE :role IN ( r )")
    List<User> findByUserRole_3(UserRole role);

    // ...
}
java spring hibernate collections querydsl
1个回答
0
投票

我遇到了类似的问题,本文中的信息在对我的项目进行一些上下文修补后解决了我的问题。

https://aregall.tech/hibernate-6-custom-functions

© www.soinside.com 2019 - 2024. All rights reserved.