gpt4 book ai didi

java - OpenJPA criteriaBuilder 嵌套对象属性获取

转载 作者:搜寻专家 更新时间:2023-10-30 19:42:36 26 4
gpt4 key购买 nike

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 中引入不需要的垃圾,不计算展平复杂图所需的时间或它的错误倾向(它可能会在很多方面出错)。

有没有办法让它工作?任何想法表示赞赏。

最佳答案

嘿,解决方案出奇地简单 - 它看起来真的很难看,但它确实有效。

predicate1 = criteriaBuilder.and(predicate1, criteriaBuilder.equal(rootObj.get("Y").<String> get("Z"), param1));}

我真的不知道是否有更优雅的解决方案。

关于java - OpenJPA criteriaBuilder 嵌套对象属性获取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6396877/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com