Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在JPA中创建具有超类的规范_Java_Hibernate_Jpa - Fatal编程技术网

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);
}
}