Hibernate 在Criteria Builder JPA中访问子类属性

Hibernate 在Criteria Builder JPA中访问子类属性,hibernate,jakarta-ee,jpa-2.0,criteria-api,Hibernate,Jakarta Ee,Jpa 2.0,Criteria Api,我试图将JPA的2.0标准查询与Hibernate的底层实现结合使用。我在尝试访问where子句中的子类属性时遇到问题 以下是实体的简要说明: - Class A (which is a Entity & a Table by itself) - Class B (which is a Entity & a Table by itself) - Class A has OneToMany relationship with B - Class AB &am

我试图将JPA的2.0标准查询与Hibernate的底层实现结合使用。我在尝试访问where子句中的子类属性时遇到问题

以下是实体的简要说明:

   - Class A (which is a Entity & a Table by itself)
   - Class B (which is a Entity & a Table by itself)
   - Class A has OneToMany relationship with B
   - Class AB & BA are child classes of B (Both are entities but are not mapped to any tables. It holds few properties specific to it.)
   - Let us suppose both classes AB & BA has a property '''symbol'''
现在是条件查询:

CriteriaBuilder qb = futuresEntityManager.getCriteriaBuilder();
CriteriaQuery<A> query = qb.createQuery(A.class);
Root<A> a = query.from(A.class);
Join<A,B> b = a.joinSet("aLegs", JoinType.INNER);
-----上面的行在运行时不起作用,因为b不包含对符号的引用。独生子女班AB&BA持有该证书

如何在此查询中访问子类的属性?对于符号谓词,我必须包含AB和BA

有人能帮我解决这个问题吗?

您需要使用JPA的2.0:

但是我认为您需要为每个需要的子类分别递归地执行上述操作


无关:请注意谓词中的
接受集合或表达式。请查看上面链接页面中的javadoc。

有人能帮我吗?我已经被这个问题困扰了一段时间了。我想JPA2.1有一些东西可以帮助我解决这个问题,但我还是坚持使用JPA2.0。谢谢@perissf:但是b.as(AB.class)返回了一个表达式,当我尝试将它转换到Path时,我得到了下面的ClassCast异常。java.lang.ClassCastException:org.hibernate.ejb.criteria.expression.function.CastFunction不能转换为javax.persistence.criteria.Path您能告诉我如何从表达式中获取值吗?由此看来,EclipseLink在JPA 2.0规范方面增强了此方法。如果我理解得很好,正常行为是将行更改为
Path bCasted=b.as(AB.Class)。你能试试吗?我猜EclipseLink实现支持转换到路径,但Hibernate实现不支持相同的转换。我在尝试这样做时,在运行时遇到了上述异常。
predicate=qb.and(qb.equal(a.get("id").get("accountId"), "1234"));
predicate=qb.and(predicate,b.get("symbol").in(input.getSymbol()));
Path bCasted = (Path)b.as(AB.class);
Predicate newCastedPredicate = bCasted.get("symbol").in(input.getSymbol());