6

名前付きクエリを含むマッピングファイルで JPA (EclipseLink 2.4.1) を使用しています。Eclipse のマッピング ファイルに次の警告メッセージが表示されます。

No mapping is associated with the state field path 't.progress'.

警告のタイプはJPA Problemです。私の -file の対応する行は次のnamed-queries.xmlようになります。

<named-query name="FinishedTasks">
    <query><![CDATA[SELECT t FROM Task t WHERE t.progress = 100]]></query>
</named-query>

ただし、クエリは実行時に正常に実行されるため、実行時に警告は表示されません。

ファイルは次のTask.javaようになります (抜粋)。

@Entity
public class Task extends Issue {
    private Integer progress = 0;
    public Integer getProgress() {
        return progress;
    }

    public void setProgress(final Integer progress) {
        this.progress = progress;
    }
}

Issue.javaこんな感じです(抜粋)。

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Issue implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    public long getId() {
        return id;
    }
    public void setId(final long id) {
        this.id = id;
    }
}

Issue を使用したクエリに関する警告はありません。

だから私の質問は、どうすれば警告を取り除くことができますか? そして、警告には私が気付いていない意味がありますか(前述のように、クエリは正常に実行されます)。

4

2 に答える 2

4

状態フィールド パス 't.progress' に関連付けられているマッピングはありません

これは完全に Eclipse JPA Details View (orm.xmlエディター) によるものであり、EclipseLink や JPA とはまったく関係がないと思います。この警告は、名前付きクエリが、マッピング ファイルでマップされていないt.progressJPA クエリ パス ( ) を使用していることを示しています。ビュー/xml エディターは、Java クラスのメタデータを分析していないため、JPA アノテーションを介してマップされているかどうかを認識していません。

つまり、ツールは最適な仕事をしてくれますが、技術や範囲の制限を与える可能性があります。

解決:

  • メッセージの内容を理解し、手動で JPA アノテーションを介して警告が対処されていることを確認し (または、本当に必要な場合は、適切なエンティティ マッピングをエンティティ マッピング XML ファイルに挿入します)、先に進みます...

:^)

于 2013-05-02T04:34:20.793 に答える
0

これは間違っているようです。

<named-query name="FinishedTasks">
  <query><![CDATA[SELECT t FROM Task t WHERE t.progress = 100]]></query> 
</named-query>

CDATA でそのようなものを見つけることができません。http://wiki.eclipse.org/EclipseLink/Examples/JPA/QueryOptimizationで例を参照してください。

named-queries.xml でこれを試してください。または、以下のように @NamedQuery アノテーションを使用します。

<named-query name="FinishedTasks">
  <query>SELECT t FROM Task t WHERE t.progress = 100</query> 
</named-query>

テストプロジェクトをビルドしてこれを使用するだけです

パッケージテスト;

import javax.persistence.Entity; import javax.persistence.NamedQuery;

@Entity
@NamedQuery(name = "FinishedTasks", 
  query = "SELECT t FROM Task t WHERE t.progress = 100")
public class Task extends Issue {
    private Integer progress = 0;

    public Integer getProgress() {
        return progress;
    }

    public void setProgress(final Integer progress) {
        this.progress = progress;
    }
}

JUnit を使用しても、警告は解決されませんでした。

package test;

import static org.junit.Assert.assertEquals;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;

public class TaskTest {
    private static EntityManager em;

    @BeforeClass
    public static void setUpBeforeClass() throws Exception {
        EntityManagerFactory factory = Persistence.createEntityManagerFactory("test");
        em = factory.createEntityManager();

        em.getTransaction().begin();
        Task t = new Task();
        t.setProgress(100);
        em.persist(t);
        em.getTransaction().commit();
    }

    @AfterClass
    public static void tearDownAfterClass() throws Exception {
        em.close();
    }

    @Test
    public void test() {
        Query q = em.createNamedQuery("FinishedTasks");
        List<?> list = q.getResultList();

        int expected = 1;
        int actual = list.size();
        assertEquals(actual, expected);
    }
}

私のログ

[EL 情報]: 2013-05-01 21:57:55.561--ServerSession(1763596)--EclipseLink、バージョン: Eclipse Persistence Services - 2.4.1.v20121003-ad44345 [EL 情報]: 接続: 2013-05-01

于 2013-05-01T20:09:02.710 に答える