子类上的JPA标准API过滤';属性

子类上的JPA标准API过滤';属性,jpa,hibernate-criteria,Jpa,Hibernate Criteria,我有以下实体域 父类 @实体 公共最终类SupportModuleInteraction实现可序列化{ @身份证 私人长id; @OneToMany(fetch=FetchType.EAGER,cascade=CascadeType.ALL,mappedBy=“supportModuleInteraction”) @订单列 私人列表活动; //…已写入getter/setter/其他属性 } 儿童等级体系 @实体 @继承(策略=InheritanceType.SINGLE_表) @鉴别器列(n

我有以下实体域

父类

@实体
公共最终类SupportModuleInteraction实现可序列化{
@身份证
私人长id;
@OneToMany(fetch=FetchType.EAGER,cascade=CascadeType.ALL,mappedBy=“supportModuleInteraction”)
@订单列
私人列表活动;
//…已写入getter/setter/其他属性
}
儿童等级体系

@实体
@继承(策略=InheritanceType.SINGLE_表)
@鉴别器列(name=“事件类型”)
公共抽象类事件实现可序列化{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
私人长id;
@manytone(fetch=FetchType.EAGER)
私有支持模块交互支持模块交互;
}
@实体
@鉴别器值(“搜索”)
公共最终类SearchEvent扩展事件{
@高球
私有字符串搜索项;
}
我正在尝试检索任何包含包含关键字的SearchEvent的SupportModuleInteractions

这是我用来尝试和检索那些SupportModuleInteractions的规范:

公共静态规范与SearchEventContaingKeyword(String关键字)交互{
返回新规范(){
@凌驾
公共谓词toPredicate(根smi、CriteriaQuery、CriteriaBuilder和CriteriaBuilder){
Join events=smi.Join(“事件”);
返回标准生成器(
criteriaBuilder.equal(events.type(),SearchEvent.class),
criteriaBuilder.like(events.get(“searchTerm”),“%”关键字+“%”);
}
};
}
规范未能说明事件不包含名为“searchTerm”的属性,因为该属性仅存在于SearchEvent子类中

我在这里看到了这个答案,但它并没有解决我的问题,因为查询中涉及的实体位于类层次结构之外

作为本机SQL查询,我正试图实现以下目标:

SELECT *
FROM event E JOIN support_module_interaction smi ON E.support_module_interaction_id = smi.id
WHERE event_type = 'SEARCH'
  AND search_term LIKE 'searchString'
更新日期:2019年8月31日

我已经查看并修改了规范,以使用
criteriaBuilder.treat(…)
,但运气不佳:

公共静态规范与SearchEventContaingKeyword(String关键字)交互{
返回新规范(){
@凌驾
公共谓词toPredicate(根smi、CriteriaQuery、CriteriaBuilder和CriteriaBuilder){
Join events=smi.Join(“事件”);
返回标准生成器(
criteriaBuilder.equal(events.type(),SearchEvent.class),
标准化(
criteriaBuilder.treat(events.get(“searchTerm”)、SearchEvent.class.get(“searchTerm”),
“%”+关键字+“%”);
}
};
}

Hibernate中的各种继承策略在JPA Crtieria API中很难使用

不要使用相当挑剔的
treat()

您的总体实现尚不清楚,因此我创建了一个基本示例:

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<SupportModuleInteraction> cq = cb.createQuery(SupportModuleInteraction.class);

Root<SupportModuleInteraction> supModIntRoot = cq.from(SupportModuleInteraction.class);
Join<SupportModuleInteraction, Event> supModIntEventJoin = supModIntRoot.join("events"); 

// Instantiate the Subquery and Root objects for your subclass entity
Subquery<SearchEvent> searchEventSubquery = cq.from(SearchEvent.class);
Root<SearchEvent> searchEventRoot = searchEventSubquery.from(SearchEvent.class);
// Generate the subquery and filter based on the given parameter
searchEventSubquery.select(searchEventRoot);
searchEventSubquery.where(cb.like(searchEventRoot.get("searchTerm", "%" + searchTerm + "%");

// add subquery to where clause in parent query
cq.select(supModIntRoot);
cq.where(supModIntEventJoin.in(searchEventSubquery), //other subqueries and filters...);
CriteriaBuilder cb=entityManager.getCriteriaBuilder();
CriteriaQuery cq=cb.createQuery(SupportModuleInteraction.class);
Root supModIntRoot=cq.from(SupportModuleInteraction.class);
Join supModIntEventJoin=supModIntRoot.Join(“事件”);
//实例化子类实体的子查询和根对象
子查询searchEventSubquery=cq.from(SearchEvent.class);
Root searchEventRoot=searchEventSubquery.from(SearchEvent.class);
//根据给定参数生成子查询和筛选器
searchEventSubquery.select(searchEventRoot);
searchEventSubquery.where(cb.like(searchEventRoot.get)(“searchTerm”、“%”+searchTerm+“%”);
//将子查询添加到父查询中的where子句
cq.select(supModIntRoot);
cq.where(supModIntEventJoin.in(searchEventSubquery),//其他子查询和筛选器;