简单的 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);
// ...
}
我遇到了类似的问题,本文中的信息在对我的项目进行一些上下文修补后解决了我的问题。