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
。
我正在尝试在查询中添加一个 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
。