问题描述
|
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;
}