我在申请时使用Google应用引擎和JPA。 我需要调用REST API来插入和获取记录。记录到表的插入工作正常,但是当我使用select查询时,它会产生大量错误。
错误跟踪是:
java.lang.NoSuchMethodError: org.datanucleus.store.ExecutionContext.findObject(Ljava/lang/Object;Lorg/datanucleus/store/FieldValues;Ljava/lang/Class;Z)Ljava/lang/Object;
at com.google.appengine.datanucleus.query.DatastoreQuery.entityToPojoPrimaryKey(DatastoreQuery.java:543)
at com.google.appengine.datanucleus.query.DatastoreQuery.access$100(DatastoreQuery.java:115)
at com.google.appengine.datanucleus.query.DatastoreQuery$1.apply(DatastoreQuery.java:221)
at com.google.appengine.datanucleus.query.DatastoreQuery$1.apply(DatastoreQuery.java:219)
at com.google.appengine.datanucleus.query.LazyResult.resolveNext(LazyResult.java:96)
at com.google.appengine.datanucleus.query.LazyResult.resolveAll(LazyResult.java:121)
at com.google.appengine.datanucleus.query.LazyResult.size(LazyResult.java:115)
at com.google.appengine.datanucleus.query.StreamingQueryResult.size(StreamingQueryResult.java:151)
at org.datanucleus.store.query.AbstractQueryResult.toArray(AbstractQueryResult.java:400)
at java.util.ArrayList.addAll(Unknown Source)
at org.datanucleus.query.evaluator.JavaQueryEvaluator.execute(JavaQueryEvaluator.java:160)
at org.datanucleus.query.evaluator.JPQLEvaluator.execute(JPQLEvaluator.java:112)
at com.google.appengine.datanucleus.query.JPQLQuery.performExecute(JPQLQuery.java:200)
at org.datanucleus.store.query.Query.executeQuery(Query.java:1789)
at org.datanucleus.store.query.Query.executeWithMap(Query.java:1693)
at org.datanucleus.api.jpa.JPAQuery.getResultList(JPAQuery.java:185)
对于select查询,我使用JPA的CriteriaAPI:
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Technology> cq = cb.createQuery(Technology.class);
Root<Technology> e = cq.from(entityManager.getMetamodel().entity(Technology.class));
cq.where(cb.equal(e.get(Technology_.name), {technologyName}));
Query query = entityManager.createQuery(cq);
List<Technology> list = query.getResultList();
我的技术课是: @实体 公共类技术实现Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "TechnologyID")
private Long technologyID;
@Column(name = "Name")
private String name;
public Long getTechnologyID() {
return technologyID;
}
public void setTechnologyID(Long technologyID) {
this.technologyID = technologyID;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
还有一个实体SignalStrength与Technology有多对一的关系:
@Entity
public class SignalStrength {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "SignalStrengthID")
private Long signalStrengthID;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "TechnologyID")
private Technology technology;
@Column(name = "SignalStrengthValue")
private int signalStrengthValue;
public Long getSignalStrengthID() {
return signalStrengthID;
}
public void setSignalStrengthID(Long signalStrengthID) {
this.signalStrengthID = signalStrengthID;
}
public Technology getTechnology() {
return technology;
}
public void setTechnology(Technology technology) {
this.technology = technology;
}
public int getSignalStrengthValue() {
return signalStrengthValue;
}
public void setSignalStrengthValue(int signalStrengthValue) {
this.signalStrengthValue = signalStrengthValue;
}
}
和datanucleus依赖:
<!-- Datanucleus dependencies -->
<dependency>
<groupId>com.google.appengine.orm</groupId>
<artifactId>datanucleus-appengine</artifactId>
<version>2.0.1.1</version>
</dependency>
<dependency>
<groupId>org.datanucleus</groupId>
<artifactId>datanucleus-core</artifactId>
<version>${datanucleus.version}</version>
</dependency>
<dependency>
<groupId>org.datanucleus</groupId>
<artifactId>datanucleus-api-jpa</artifactId>
<version>${datanucleus.version}</version>
</dependency>
<dependency>
<groupId>org.apache.geronimo.specs</groupId>
<artifactId>geronimo-jpa_2.0_spec</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>org.datanucleus</groupId>
<artifactId>datanucleus-enhancer</artifactId>
<version>3.1.1</version>
</dependency>
<dependency>
<groupId>javax.persistence</groupId>
<artifactId>persistence-api</artifactId>
<version>1.0.2</version>
<scope>provided</scope>
</dependency>
我做错了什么?请帮忙。
答案 0 :(得分:0)
NoSuchMethodError意味着您搞砸了CLASSPATH中的jar。其中一个罐子与另一罐子不一致。在这种情况下,名称中带有datanucleus的罐子就是那些你不一致的罐子。
由于您没有说明您使用的是哪一个,因此您必须找出基于Google文档(或实际提及它们)的内容。此页面告诉您有关一致版本https://code.google.com/p/datanucleus-appengine/wiki/Compatibility
的所有信息