JPA:使用 Criteria API 时出现无效密钥错误

发布于 2024-10-30 13:23:01 字数 1619 浏览 3 评论 0原文

使用标准 API 时,我总是遇到相同的错误: 使用

    Local Exception Stack:
Exception [EclipseLink-6075] (Eclipse Persistence Services - 2.0.1.v20100213-r6600): org.eclipse.persistence.exceptions.QueryException
Exception Description: Object comparisons can only use the equal() or notEqual() operators.  Other comparisons must be done through query keys or direct attribute level comparisons.
Expression: [
Relation operator  LIKE
   Query Key rootId
      Base de.uni.entities.Diary
   Constant Testaccount]
Query: ReportQuery(referenceClass=Diary )

标准 API 的代码如下:

        ....
    CriteriaBuilder cb = getEm().getCriteriaBuilder();
    CriteriaQuery<User> cq = cb.createQuery(User.class);

    // Restrictions
    Predicate[] predicate = new Predicate[1];

    // From-clause
    Root<User> root2R = cq.from(User.class);
    predicate[0] = cb.like(root2R.<String> get("rootId"), id);

    Join<Clazz, Diary> friends2R;
    friends2R = root2R.join("diaries");

    cq.where(predicate);

    // Select-clause
    cq.select((Selection<? extends Clazz>) friends2R);

    Query query = getEm().createQuery(cq);

    List<Object> data = query.getResultList();

    return data;

}

问题的存在是因为以下两行: “ 加入friends2R; Friends2R = root2R.join("diaries");"

如果没有映射(使用调整后的 select 子句),我将获得具有合适 rootId 的搜索用户,这样就不会发生错误。但现在我想将用户映射到日记并显示用户实体的所有日记,但它总是以前面的错误结束。无论我使用“like”还是“equal”,它都不起作用

,因为我'我已经使用相同的代码来获取用户的所有映射用户(多对多关系)=>

我只是不明白为什么会发生此错误,特别是为什么它提到日记作为基础,尽管用户应该这样做。被提及为基类...并且 id 也是正确的,并且也在数据库中出现...

我真的希望你能帮助我,提前感谢!

I always get the same error when using the criteria API:

    Local Exception Stack:
Exception [EclipseLink-6075] (Eclipse Persistence Services - 2.0.1.v20100213-r6600): org.eclipse.persistence.exceptions.QueryException
Exception Description: Object comparisons can only use the equal() or notEqual() operators.  Other comparisons must be done through query keys or direct attribute level comparisons.
Expression: [
Relation operator  LIKE
   Query Key rootId
      Base de.uni.entities.Diary
   Constant Testaccount]
Query: ReportQuery(referenceClass=Diary )

The code with the criteria API is the following:

        ....
    CriteriaBuilder cb = getEm().getCriteriaBuilder();
    CriteriaQuery<User> cq = cb.createQuery(User.class);

    // Restrictions
    Predicate[] predicate = new Predicate[1];

    // From-clause
    Root<User> root2R = cq.from(User.class);
    predicate[0] = cb.like(root2R.<String> get("rootId"), id);

    Join<Clazz, Diary> friends2R;
    friends2R = root2R.join("diaries");

    cq.where(predicate);

    // Select-clause
    cq.select((Selection<? extends Clazz>) friends2R);

    Query query = getEm().createQuery(cq);

    List<Object> data = query.getResultList();

    return data;

}

The problem exists because of the following two lines:
" Join friends2R;
friends2R = root2R.join("diaries");"

Without the mapping (with an adjusted select-clause) i would get the searched User with the fitting rootId, so that there occurs no error. But now i wanna map the User with the Diaries and show all diaries of the User-entity. But it always ends in the error ahead. Whether i use "like" or "equal", it doesn't work.

The generell code shouldn't have an error, because i'm using the same code already to get all mapped Users of a User (many to many relation) => no problem.

I just don't understand, why this error occurs and especially why it mentions the Diary as Base although the user should be mentioned as the base-class...and the id is right too and also appears so in the database...

I really hope that you can help me, thanks in advance!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

清引 2024-11-06 13:23:01

如何使用 Basic 或 OneToOne 映射 rootId?
似乎是一个错误,请在 EclipseLink 上记录该错误。

不过,您的代码似乎不正确,

CriteriaQuery cq = cb.createQuery(User.class);

应该是,

CriteriaQuery cq = cb.createQuery(Diary.class);

不应该吗?

日记不也和用户有关系吗?你可以只查询 Diary,其中它的用户有 id。

How is rootId mapped, using a Basic, or OneToOne?
Seems to be a bug, please log the bug on EclipseLink.

Your code does not seem correct though, the

CriteriaQuery cq = cb.createQuery(User.class);

should be,

CriteriaQuery cq = cb.createQuery(Diary.class);

should it not?

Doesn't Diary also have a relationship to User? You could just query Diary where its user has the id.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文