【问题标题】:Is there a simple way to just select entity's id using criteria query?有没有一种简单的方法来使用标准查询来选择实体的 id?
【发布时间】:2015-05-17 21:29:32
【问题描述】:

JPQL 让这种改变变得非常容易:

Select o from Orders as o where....

Select o.id from Orders as o where....

但在条件查询中:

CriteriaBuilder builder = kem.getCriteriaBuilder();
CriteriaQuery<Orders> query = builder.createQuery(Orders.class);
Root<Order> orders= query.from(Orders.class);
query.select(orders);
....

看起来选择项是由 builder.createQuery(Order.class) 定义的,没有任何灵活性。

我知道我们可以使用 Tuple.class,但是除了 like 之外,还有什么更好的方法可以从复杂的查询中获取额外的 id(只有一个字段)?没有这样的特征标准查询变得非常缺乏灵活性。

【问题讨论】:

  • 我认为您可以根据以下问题查询 Tuple 对象:stackoverflow.com/questions/12618489/…
  • @Petros Splinakis 谢谢,但这里的问题是我们必须迭代所有结果以提取唯一的字段值。 Select 只返回一个对象的集合。没有选项可以像在 JPQL 中那样选择单个字段并直接获取结果列表。

标签: jakarta-ee jpa ejb jpql


【解决方案1】:

JPA Metamodel API 可以用于此。

CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<Long> query = builder.createQuery(String.class);
Root<Order> root = query.from(Orders.class);
query.select(root.get(Orders_.id));

这里,Orders_Orders 实体的元模型类。

【讨论】:

  • 谢谢。那么在这种情况下最好为实体类创建元模型类?如果我只在 metaModel 类中放置 id 字段也可以吗?
  • 当然,如果只有一门课,您可以采用这种方法。或者,您可以考虑使用会自动为您生成元模型类的元模型生成器。
  • 生成器应该生成二进制代码中的类,所以我敢打赌它会生成实际代码。那么我们如何避免IDE的错误(Eclipse可能会抱怨该类不存在)
  • 不一定。一些生成器在编译阶段之前生成元模型类的源代码。有时您可以控制这些类的生成位置。您可以将生成位置添加到 Eclipse 项目类路径中。如果这对您不起作用,您始终可以手动生成元模型类。无论如何,您的原始问题已得到解答,因为 Eclipse 错误不是您原始问题的一部分。您应该尝试建议的解决方案,如果遇到特定于您正在使用的 IDE 的错误,您应该提出一个单独的问题。
  • 非常感谢您的指导!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-14
  • 2012-06-15
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 2012-07-26
相关资源
最近更新 更多