【问题标题】:JPA Convert List<Tuple> to List<myClass>JPA 将 List<Tuple> 转换为 List<myClass>
【发布时间】:2015-11-16 11:59:09
【问题描述】:

我有以下返回列表的 Criteria API 代码。

我想把它转换成List&lt;myClass&gt;

我该怎么做?

CriteriaQuery<Tuple> cq = cb.createTupleQuery();

Root<ProductCatalogue> pc = cq.from(ProductCatalogue.class);
Root<ProductList> al = cq.from(ProductList.class);
.......
.......
.......

Predicate[] predicates = new Predicate[predicateList.size()];
predicateList.toArray(predicates);
criteriaQuery.where(predicates);

TypedQuery<Tuple> typedQuery = getEntityManager().cq(criteriaQuery);
List<Tuple> tuple = typedQuery.getResultList();

理想情况下我愿意

List<Employee> emp = tuple

但是上面导致了不兼容的类型错误,我不知道我该如何转换。

【问题讨论】:

  • 你真的需要元组吗?如果没有,为什么不直接创建CriteriaQuery&lt;Employee&gt;?例如见here

标签: jpa tuples eclipselink jpa-2.0 criteria-api


【解决方案1】:

如果您坚持使用元组查询,则必须手动转换实例。
如果myClass 是一个实体,您应该按照 perissf 的建议使用 CriteriaQuery&lt; myClass&gt;,否则您可以使用“构造函数表达式”直接从选择中创建实例,例如:

select new com...myClass(c.id, c.price) FROM ProductList c WHERE c.....;

有关使用 Criteria API 创建此类查询的示例,请参阅 this answer

【讨论】:

  • 使用元组的原因是因为this。为了摆脱Partial object queries are not allowed to maintain the cache or be edited,我开始使用Tuple。
  • 我了解,您不想选择实体所需的所有数据,这就是 JPA 无法从(部分)查询创建实例的原因。所以你正在使用元组查询,很好。但是您如何期望在任意 Tuple 和您的类之间进行自动映射?魔法?现在,如果您想得好,我可以将某种映射指令传递给查询瞧,这就是我在回答中提到的所谓的“构造函数表达式”!
  • 查询之后你又回到了普通的 Java 领域,这意味着 Tuple 和你的类之间不可能存在任何类型的自动映射(转换)!但是使用 Java8 流,您的转换可能就像 return tuples.stream().map(t -&gt; new MyClass(t.get(idExpr), t.get(priceExpr), ...)).collect(Collectors.toList()) 一样简单
  • 然后使用构造函数表达式或循环。如果这还不够清楚:您也可以为实体使用构造函数表达式。
  • Robin,我已经通过构造函数表达式解决了这个问题,非常感谢您的见解
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-21
  • 2016-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多