OpenJPA条件Builder嵌套对象属性访存

| OpenJPA中是否可以通过CriteriaBuilder获得嵌套对象属性的任何方法? 这是一个小案件。
@Entity
public class X {
       private Object Y;

       // getters, setters...
}

@Entity
public class Y {
       private String Z;

       // getters, setters...
}
因此,在使用CriteriaBuilder时,我们使用X作为根,即:
@PersistenceContext
private EntityManager entityManager;

//.....

Root<X> rootObj = criteriaBuilder.from(X.class);
CriteriaQuery<X> select;

String param1 = X.getY().getZ();

// initializing predicate, default value is TRUE
Predicate predicate1 = criteriaBuilder.isNull(null);

// construct search predicate which fails miserably due to IllegalArgumentExecption
if (X != null) {
predicate1 = criteriaBuilder.and(predicate1, criteriaBuilder.equal(rootObj.<String> get(\"Y.Z\"), param1));}
现在,我的悲伤是->
get(\"Y.Z\")
CriteriaBuilder不知道以反射方式获取Z(但是可以并且将解析Y)。有什么方法可以直接从get()获取Z吗? 除了使用JPQL之外,我还可以想到另一种方法-我非常讨厌:我想我可以将Z公开为X中的exposed3ѭ属性(以防止OpenJPA将其持久化为列),但这听起来像是坏主意:我本质上是手动展平对象图,并在实体bean中引入不需要的垃圾,没有计算展平复杂图所需的时间或该图的错误倾向性(它可能会以多种方式出错)。 有没有办法使这项工作?任何想法表示赞赏。     
已邀请:
        呵呵,解决方案非常简单-看起来确实很丑,但是行得通。
predicate1 = criteriaBuilder.and(predicate1, criteriaBuilder.equal(rootObj.get(\"Y\").<String> get(\"Z\"), param1));}
我真的不知道是否有更优雅的解决方案。     
        对于任何任意的嵌套属性路径(\“ relation.subRelation.attribute \”):
private Path<T> getPath(Root<T> root, String attributeName) {
    Path<T> path = root;
    for (String part : attributeName.split(\"\\\\.\")) {
        path = path.get(part);
    }
    return path;
}
    

要回复问题请先登录注册