Java 在JPA中创建具有超类的规范
我有一个实体Java 在JPA中创建具有超类的规范,java,hibernate,jpa,Java,Hibernate,Jpa,我有一个实体扫描,它有一个字段-super-class元数据。我想创建一个规范来查找 metadata.name = 'something' 可能吗?当我尝试这样做时,我得到一个异常: org.springframework.dao.InvalidDataAccessApiUsageException: Unable to locate Attribute with the the given name [name] on this ManagedType [Metadata]. 下面列
扫描
,它有一个字段-super-class元数据
。我想创建一个规范来查找
metadata.name = 'something'
可能吗?当我尝试这样做时,我得到一个异常:
org.springframework.dao.InvalidDataAccessApiUsageException: Unable to locate Attribute with the the given name [name] on this ManagedType [Metadata].
下面列出了这些课程
@实体
@表(name=“scan”)
公共类扫描{
@身份证
@生成值
@列(name=“scan\u id”)
私人长id;
//……其他领域
@OneToOne(级联=级联类型.ALL)
@PrimaryKeyJoinColumn
私有元数据;
//…能手,二传手
}
@实体
@表(name=“元数据”)
@继承(策略=继承类型。每个类的表)
@鉴别器列(name=“META_TYPE”)
@审计
公共抽象类元数据{
@身份证
@生成值
@列(name=“metadata\u id”)
私人长id;
@MapsId
@OneTONE(mappedBy=“元数据”)
@JoinColumn(name=“扫描id”)
私人扫描;
//…能手,二传手
}
@实体
@表(name=“letter\u元数据”)
@鉴别器值(“字母”)
@审计
公共类元数据扩展了元数据{
@列(name=“name”)
私有字符串名称;
//…能手,二传手
}
我的存储库类:
@存储库
公共接口扫描存储库扩展了JpaRepository,JpaSpecificationExecutor{
}
您需要这样的查询
select s from Scan s, LetterMetadata lmd
where s.metadata.id=lmd.id where lmd.name=:lmdName
因此,规范可以这样做
public static Specification<Scan> letterMetadataNameEquals(String lmdName) {
return (root, query, builder) -> {
Root<LetterMetadata> lmd = query.from(LetterMetadata.class);
return builder.equal(root.get("metadata").get("id"), lmd.get("id"))
.and(builder.equal(lmd.get("name"), lmdName));
}
}
公共静态规范letterMetadataNameEquals(字符串lmdName){
返回(根、查询、生成器)->{
Root lmd=query.from(LetterMetadata.class);
返回builder.equal(root.get(“元数据”).get(“id”)、lmd.get(“id”))
.和(制造商同等(lmd.get(“名称”)、lmdName);
}
}