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;

}

この問題は、次の 2 行が原因で発生します。「 Join friends2R; friends2R = root2R.join("diaries");」

マッピングがなければ (select-clause を調整して)、適切な rootId を持つ検索されたユーザーを取得するため、エラーは発生しません。しかし今、ユーザーを日記にマップし、ユーザーエンティティのすべての日記を表示したいと思います。しかし、それは常に先のエラーで終わります。「好き」を使っても「等しい」を使ってもうまくいきません。

ユーザーのマップされたすべてのユーザー(多対多の関係)を取得するためにすでに同じコードを使用しているため、generellコードにエラーはありません=>問題ありません。

なぜこのエラーが発生するのか、特に、ユーザーがベースクラスとして言及されるべきなのに、ダイアリーがベースとして言及される理由がわかりません...そしてIDも正しく、データベースにもそう表示されます...

よろしくお願いします。

4

1 に答える 1

1

Basic または OneToOne を使用して、rootId はどのようにマップされますか? バグのようです。バグを EclipseLink に記録してください。

あなたのコードは正しくないようですが、

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

あるべきです、

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

すべきではありませんか?

ダイアリーもユーザーと関係ないの?ユーザーがIDを持っているDiaryをクエリするだけです。

于 2011-04-06T12:40:10.967 に答える