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;
    }
}

我没有关于使用问题的查询的警告。

所以我的问题是,我该如何摆脱警告?并且警告是否有一些我不知道的含义(如上所述,查询运行良好)。

4

2 回答 2

4

没有映射与状态字段路径“t.progress”相关联

我相信这完全是由于 Eclipse JPA 详细信息视图(orm.xml编辑器),一般与 EclipseLink 或 JPA 无关。该警告提醒您命名查询正在使用未在映射文件中映射t.progress的 JPA 查询路径 ( ) 。View / 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>

我只是建立一个测试项目并使用它

包装测试;

导入 javax.persistence.Entity;导入 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 回答