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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.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 CriteriaQuery对抽象类子类属性进行筛选_Java_Hibernate_Jpa_Jpa 2.1_Criteriaquery - Fatal编程技术网

Java 如何让JPA CriteriaQuery对抽象类子类属性进行筛选

Java 如何让JPA CriteriaQuery对抽象类子类属性进行筛选,java,hibernate,jpa,jpa-2.1,criteriaquery,Java,Hibernate,Jpa,Jpa 2.1,Criteriaquery,我无法让JPA查询使用builder.treat()方法将AbstractAddress实体强制转换为其子类AddressStd builder.equal(builder.treat(contracts.get)(“address”), 地址标准类 ).get(“houseNo”),std.getHouseNo()); 背景 我使用JPA2.1(Hibernate 5.0.2 FINAL)映射了一个遗留数据库,其中一个客户有0:n个联系人,每个联系人都有一个子类型AddressStd或Add

我无法让JPA查询使用builder.treat()方法将
AbstractAddress
实体强制转换为其子类
AddressStd

builder.equal(builder.treat(contracts.get)(“address”),
地址标准类
).get(“houseNo”),std.getHouseNo());
背景

我使用JPA2.1(Hibernate 5.0.2 FINAL)映射了一个遗留数据库,其中一个
客户
有0:n个联系人,每个
联系人
都有一个子类型
AddressStd
AddressPOB
(PO框)的
AbstractAddress
。该触点具有其他属性,但为简单起见,下面未显示这些属性

域模型

@实体
@表(name=“客户”)
公共类客户
@Id@Column(name=“Id”,nullable=false)
@GeneratedValue(策略=GenerationType.SEQUENCE,generator=“SEQ_CUSTOMER_ID”)
@SequenceGenerator(name=“SEQ_CUSTOMER_ID”,sequenceName=“SEQ_CUSTOMER_ID”)
私人长id;
@OneToMany(fetch=FetchType.LAZY,mappedBy=“Customer”,orphanRemoving=true,cascade=CascadeType.ALL)
私人设置联系人;
...
}
@实体
@表(name=“CONTACT”)
公共类联系人{
@Id@Column(name=“CONTACT\u Id”,nullable=false)
私人长id;
@基本@列(name=“ROLE”,长度=30)
@Convert(converter=ProfileTypeConverter.class)
私人联系人类型;
@OneToOne(fetch=FetchType.LAZY,mappedBy=“contact”,orphanRemoving=true,cascade=CascadeType.ALL)
私人抽象地址;
}    
@实体
@表(name=“ADDRESS”)
@继承(策略=InheritanceType.SINGLE_表)
@鉴别器公式(“订单号为空时,则为‘地址’标准’或‘地址’结束”)
公共抽象类抽象地址{
@Id@Column(name=“Id”,null=false,精度=0)
@GeneratedValue(策略=GenerationType.SEQUENCE,generator=“SEQ_地址”)
@SequenceGenerator(name=“SEQ\u ADDRESS”,sequenceName=“SEQ\u ADDRESS”)
私人长id;
@奥内托内
@PrimaryKeyJoinColumn(name=“CONTACT\u ID”,referencedColumnName=“ID”)
私人接触;
@基本@列(名称=“邮政编码”,长度=10)
私人字符串邮政编码;
@基本@列(name=“CITY”,长度=40)
私人城市;
@基本@列(name=“COUNTRY”,长度=2)
@Convert(converter=CountryConverter.class)
私人国家;
@基本(可选=假)
@列(name=“LNG\U代码”,长度=2)
@Convert(converter=LanguageConverter.class)
私人语言;
@基本(可选=假)
@列(name=“STATUS”,长度=1)
@Convert(converter=BooleanActiveConverter.class)
私有布尔值isActive=true;
}
@实体
@鉴别器值(“地址标准”)
公共类AddressStd扩展了AbstractAddress{
@基本@列(name=“房屋号”,长度=8)
私人字符串编号;
@基本@列(name=“STREET\u name”,长度=30)
私家弦街;;
...
} 
@实体
@鉴别器值(“地址”)
公共类AddressPOB扩展了AbstractAddress{
@基本的
@列(名称=“采购箱编号”,长度=8)
私有字符串poBoxNo;
... 
}
JPA查询

构建查询用于检索
AbstractAddress
属性(
城市、邮政编码、国家/地区、语言、isActive
),但我无法让它分别检索
地址std
houseNo,street
)和
地址POB
poBoxNo
)的子类属性,如下语句

builder.equal(builder.treat(contracts.get)(“address”),
地址标准类
).get(“houseNo”),std.getHouseNo());
引发运行时异常

java.lang.IllegalArgumentException:无法找到具有
此ManagedType[com.compX.appY.domain.contacts.AbstractAddress]上的给定名称[houseNo]
我以前使用过builder.treat()方法强制转换类型,效果很好。但是在本例中.treat()无法将地址强制转换为
AddressStd.class
?你们JPA大师中有谁知道为什么,非常感谢,达维特

请参见此处的CriteriaQuery生成器代码

private CriteriaQuery createCriteria(CustomerSearchCriteria搜索){
CriteriaBuilder=getEntityManager().getCriteriaBuilder();
CriteriaQuery criteria=builder.createQuery(Customer.class);
Root=标准.from(Customer.class);
列表,其中=新建ArrayList();
....
if(search.getContactAddress()!=null){
AbstractAddress a=search.getContactAddress();
Join contracts=root.Join(“contacts”);//Customer.contacts
if(地址std的实例){
AddressStd=(AddressStd)a;
if(std.getHouseNo()!=null)where.add(builder.equal(builder.treat(contracts.get(“address”),AddressStd.class.get(“houseNo”),std.getHouseNo());
if(std.getStreet()!=null)where.add(builder.equal(builder.treat(contracts.get(“地址”),AddressStd.class.get(“街道”),std.getStreet());
}else if(地址POB的实例){
地址pob pob=(地址pob)a;
if(pob.getPoBoxNo()!=null)where.add(builder.equal(builder.treat(contracts.get(“address”)、AddressPOB.class.get(“poBoxNo”)、pob.getPoBoxNo());
}
如果(a.getCity()!=null)where.add(builder.equal(contracts.get(“address”).get(“city”),a.getCity());
如果(a.getPostcode()!=null)where.add(builder.equal(contracts.get(“address”).get(“postcode”),a.getPostcode());
如果(a.getCountry()!=null)where.add(builder.equal(contracts.get(“address”).get(“country”),a.getCountry());
如果(a.getLanguage()!=null)where.add(builder.equal(contracts.get(“地址”).get(“语言”),a。