JPA: ошибка неверного ключа при использовании Criteria API - PullRequest
0 голосов
/ 06 апреля 2011

Я всегда получаю ту же ошибку при использовании 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 ("дневники"); "

Без отображения (со скорректированным предложением select) я бы получил искомого пользователя с подходящим rootId, чтобы не возникало ошибок. Но теперь я хочу сопоставить пользователя с дневниками и показать все дневники объекта-пользователя. Но это всегда заканчивается ошибкой впереди. Использую ли я «нравится» или «равно», это не работает.

В общем коде не должно быть ошибки, потому что я уже использую тот же код для получения всех сопоставленных пользователей пользователя (отношение многие ко многим) => нет проблем.

Я просто не понимаю, почему возникает эта ошибка и, в особенности, почему она упоминает Дневник как Базовый, хотя пользователь должен быть упомянут как базовый класс ... и идентификатор тоже правильный, а также появляется в базе данных ...

Очень надеюсь, что вы мне поможете, заранее спасибо!

1 Ответ

1 голос
/ 06 апреля 2011

Как сопоставляется rootId, используя Basic или OneToOne? Кажется, это ошибка, пожалуйста, зарегистрируйте ошибку на EclipseLink.

Ваш код не выглядит правильным, хотя

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

должно быть,

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

разве не так?

Разве Дневник также не связан с Пользователем? Вы можете просто запросить дневник, где его пользователь имеет идентификатор.

...