【问题标题】:Criteria API: query.from returns only null标准 API:query.from 仅返回 null
【发布时间】:2011-10-14 23:21:41
【问题描述】:

我对 Criteria API 还是很陌生,事实上,我只是为了 Criteria API 将我们的最新项目推送到 JBoss 6 和 JPA 2.0。

现在我正在尝试运行最简单的查询,但不知何故没有成功:

如果没有 Criteria API,它可以正常工作(Msv 是我的实体类):

Msv someMsv = manager.find(Msv.class, 1234L);
System.out.println(someMsv);

然而,标准的东西并没有给我来自数据库的任何结果:

CriteriaBuilder builder = manager.getCriteriaBuilder();
CriteriaQuery<Msv> criteriaQuery = builder.createQuery(Msv.class);
Root<Msv> from = criteriaQuery.from(Msv.class);
// this returns null! /\
Path<Msv> pk = from.get("PK_MSV_NR");
Expression<Boolean> exp = builder.equal(pk, 1234L);
CriteriaQuery<Msv> select = criteriaQuery.select(from).where(exp);
[...]

在运行第二个代码片段时,我在第 5 行(路径 pk ...)抛出 NullPointerException,因此上面的 cireriaQuery.from 返回 null。

我是否遗漏了一些重要的东西,或者这里有什么问题?第一个 sn-p 能够从数据库中提取正确的条目并对其进行 syso,所以我认为这不是我的持久性配置的问题,而是我的 Criteria API 代码的问题。但是我从教程中提取的那个基本上是一行一行的......

技术:我正在使用 hibernate-3.6.6、hibernate-jpa-2.0-cr、jboss-as-6.0.0 和 oracle11。

编辑: 对此进行了更多研究并发现了以下内容:实际上并不是 criteriaQuery.from(...) 产生了 null。 NullPointerException 没有被抛出,因为 .get() 是在 null 上调用的,但 实际上是由/在 .get() 方法中抛出的。但是,我一生都看不到为什么...

【问题讨论】:

    标签: hibernate jakarta-ee persistence jpa-2.0 criteria-api


    【解决方案1】:

    啊,我终于发现我做错了什么。当我让 eclipse 为我生成实体类时,我没有对它们的字段命名给予足够的关注。

    我要查找的字段在数据库中称为“PK_MSV_NR”,但 Eclipse 在实体类中将其命名为“pkMsvNr”。于是就有了问题。

    不过,我认为从中抛出 NullPointerException 是一种奇怪的行为。这里真的没有太多的空指向......

    【讨论】:

    • 这就是您应该使用 JPA 2 静态元模型类的原因之一,它们为您提供编译时安全性。有关休眠版本,请参阅Hibernate Metamodel Generator
    • 我即将实现这一点。我只是想,起初我宁愿不立即开始使用所有新 API,而是先启动并运行一些简单的 Criteria API,然后再担心元模型的生成……不过,后者结果非常简单。跨度>
    猜你喜欢
    • 2011-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多