我正在使用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的查询的警告。
所以我的问题是,如何摆脱警告?警告是否有一些我不知道的含义(如上所述,查询运行正常)。
答案 0 :(得分:4)
没有映射与状态字段路径't.progress'
相关联
我认为这完全归功于Eclipse JPA Details View(orm.xml
编辑器),并且与EclipseLink和JPA无关。警告提醒您,命名查询使用的JPA查询路径(t.progress
)未映射到映射文件。 View / xml编辑器不分析java类的元数据,因此不知道它是否通过JPA注释映射。
即。该工具正在为您做最好的工作,它可能会给它的技术/范围限制。
<强>解决方案:强>
:^)
答案 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