JPA警告:“没有映射与状态字段路径't.progress'相关联”

时间:2013-03-05 14:26:41

标签: jpa eclipselink jpql

我正在使用JPA(EclipseLink 2.4.1)和一个包含命名查询的映射文件。 Eclipse在我的映射文件中向我显示以下警告消息:

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

警告属于JPA Problem类型。我的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的查询的警告。

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

2 个答案:

答案 0 :(得分:4)

  

没有映射与状态字段路径't.progress'

相关联

我认为这完全归功于Eclipse JPA Details View(orm.xml编辑器),并且与EclipseLink和JPA无关。警告提醒您,命名查询使用的JPA查询路径(t.progress未映射到映射文件。 View / xml编辑器不分析java类的元数据,因此不知道它是否通过JPA注释映射

即。该工具正在为您做最好的工作,它可能会给它的技术/范围限制。

<强>解决方案:

  • 了解消息的含义,手动确保通过JPA注释解决警告(如果您确实必须,请将适当的实体映射插入实体映射XML文件中),然后继续...

:^)

答案 1 :(得分: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 Info]:2013-05-01   21:57:55.561 - ServerSession(1763596) - EclipseLink,版本:Eclipse   持久性服务 - 2.4.1.v20121003-ad44345 [EL Info]:连接:2013-05-01