【发布时间】:2011-09-17 19:41:21
【问题描述】:
OpenJPA 中是否有任何方法可以通过 CriteriaBuilder 获取嵌套对象属性?
这是一个小盒子。
@Entity
public class X {
private Object Y;
// getters, setters...
}
@Entity
public class Y {
private String Z;
// getters, setters...
}
所以,在使用 CriteriaBuilder 时,我们使用 X 作为 Root,即:
@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 中的 @Transient 属性(以防止 OpenJPA 将其作为列持久化),但是这听起来像是一个非常糟糕的主意:我实际上是在手动展平对象图并在实体 bean 中引入不需要的垃圾,而不是计算展平复杂图所需的时间或它的错误倾向(它可能会出错有很多方法)。
有没有办法让它工作?任何想法都表示赞赏。
【问题讨论】:
标签: java criteria-api openjpa