QueryDsl Embedded 未映射

QueryDsl Embedded is not mapped

我正在尝试在查询中添加一个 where 条件,以检查一个列表中的任何值是否存在于另一个列表中。

jpaQuery.where(adminDsl.role.profiles.any().`in`(getUserRole().profiles))

但我收到“QuerySyntaxException:角色未映射”。我认为这是因为 Role 嵌入在 Administrator 中(代码见下文)。

[INFO] GCLOUD: java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: Role is not mapped [select sqlAdministrator
[INFO] GCLOUD: from com.wizy.emm.domain.sql.SqlAdministrator sqlAdministrator
[INFO] GCLOUD:   left join sqlAdministrator.federation
[INFO] GCLOUD: where sqlAdministrator.federation.name = ?1 and exists (select 1
[INFO] GCLOUD: from Role sqlAdministrator_role_530393770 --This line is the issue 
[INFO] GCLOUD:   inner join sqlAdministrator_role_530393770.profiles as sqlAdministrator_role_profiles_0
[INFO] GCLOUD: where sqlAdministrator_role_530393770 = sqlAdministrator.role and sqlAdministrator_role_profiles_0 = ?2)]
@Entity
@Table(uniqueConstraints = [UniqueConstraint(columnNames = ["email", "federation_id"])])
class SqlAdministrator internal constructor(
        federation: SqlCustomer,
        override var firstName: String,
        override var lastName: String,
        override var email: String,
        @Embedded
        @Column(nullable = false)
        @Target(SqlRole::class)
        override var role: Role
): Administrator

interface Administrator
    : ModelEntity<UUID> {
    var email: String
    var firstName: String
    var lastName: String
    var role: Role
}
@GenerateDefaultConstructor
class SqlRole(
        @Column(nullable = false)
        @Enumerated(EnumType.STRING)
        override val type: RoleType,
        profiles: Set<Policy> = setOf(),
        endpoints: Set<EndpointAction> = setOf(),
        @Enumerated(EnumType.STRING)
        override val restrictionType: RestrictionType = RestrictionType.NONE
): Role

interface Role {
    val type: RoleType
    var profiles: Set<Policy>
    var endpoints: Set<EndpointAction>
    val restrictionType: RestrictionType
}

解决方案可能是将 Role 移动到单独的 table 成为一个实体,但这意味着迁移任务。

有没有没有迁移任务的方案?

谢谢

你只需要在你的 persistence.xml 中将 SqlRole 注册为 Embeddable(或者用 @Embeddable 注释它)。我也不确定 @Target 允许嵌入,但我很确定它不是。所以你必须将字段类型也更改为 SqlRole