问题描述
我正在尝试在查询中添加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
移动到一个单独的表中成为一个实体,但这将意味着迁移任务。
是否存在没有迁移任务的解决方案?
谢谢
解决方法
您只需要在SqlRole
中将Embeddable
注册为persistence.xml
(或用@Embeddable
进行注释。我也不确定@Target
是否为 > 目录> > 的>设置的允许嵌入的字段“的允许的范围内,可以将字段类型设置为SqlRole