JPA: ошибка неверного ключа при использовании Criteria API

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

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

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

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

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


person Tamuha    schedule 05.04.2011    source источник


Ответы (1)


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

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

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

должно быть,

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

не должно?

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

person James    schedule 06.04.2011