在Criteria Builder JPA中访问子类属性

4

我正在尝试使用JPA 2.0的标准查询语句与Hibernate的底层实现。在尝试访问子类属性时,我遇到了困难。

以下是实体的简要描述:

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

现在当我形成谓词时:

predicate=qb.and(qb.equal(a.get("id").get("accountId"), "1234"));
predicate=qb.and(predicate,b.get("symbol").in(input.getSymbol()));

-----由于b没有持有对符号的引用,所以上述行在运行时不起作用。只有子类AB和BA才拥有它。

如何在此查询中访问子类的属性?我必须为符号断言包括AB和BA两个类。

谁能帮助我解决这个问题?


有人能帮我解决这个问题吗?我已经卡在这个问题上一段时间了。我猜 JPA 2.1 有一个叫做 TREAT AS 的东西,可能可以帮助我解决这个问题,但是我现在只能使用 JPA 2.0。 - user1166031
1个回答

0

你需要使用JPA 2.0的Epression#as()

Path bCasted = (Path)b.as(AB.class);
Predicate newCastedPredicate = bCasted.get("symbol").in(input.getSymbol());

但我认为您需要分别递归执行上述操作,以满足所需的每个子类。

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


1
谢谢@perissf:但是b.as(AB.class)返回一个表达式,当我尝试将其转换为Path时,我会收到以下ClassCast异常。java.lang.ClassCastException: org.hibernate.ejb.criteria.expression.function.CastFunction无法转换为javax.persistence.criteria.Path请问如何从表达式中获取值? - user1166031
从这个链接来看,EclipseLink在JPA 2.0规范方面增强了这种方法。如果我理解正确,当将该行更改为Path<AB> bCasted = b.as(AB.Class);时,就会得到“正常”的行为。你可以试试吗? - perissf
1
我猜EclipseLink实现支持转换为Path,但Hibernate实现不支持相同的操作。当我尝试这样做时,在运行时遇到了上述异常。 - user1166031

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接