Ich wurde SELECT
von createQuery
wie diese versuchen:Konvertieren Frage an TypeQuery gibt java.lang.AbstractMethodError Ausnahme
Query query3 = em.createQuery("SELECT t FROM Tag t WHERE t.name IN (:tag1, :tag2)");
query3.setParameter("tag1", "tag1");
query3.setParameter("tag2", "tag2");
Set<Tag> tags = new HashSet<Tag>(query3.getResultList());
Dieser Code funktioniert gut, jedoch habe ich diese Warnung:
Typ Sicherheit : Der Ausdruck des Typs Liste muss unkontrolliert konvertiert werden, um der Liste
zu entsprechen, also gemäß this answer, I REPLCE Query
mit TypedQuery
wie folgt aus:
TypedQuery<Tag> query2 = em.createQuery("SELECT t FROM Tag t WHERE t.name IN (:tag1, :tag2)", Tag.class);
query2.setParameter("tag1", "tag1");
query2.setParameter("tag2", "tag2");
Set<Tag> tags = new HashSet<Tag>(query2.getResultList());
Die Warnung verschwunden ist, aber wenn ich es laufen, erzeugt es einen Laufzeitfehler wie folgt aus:
java.lang.AbstractMethodError: org.apache.openejb.persistence.JtaEntityManager.createQuery(Ljava/lang/String;Ljava/lang/Class;)Ljavax/persistence/TypedQuery;
at ut.ConfTest.testCreatePost(ConfTest.java:269)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Ich verstehe nicht, aus, was mit meinem Code nicht stimmt. Habe ich etwas mit TypedQuery durcheinander gebracht?
so etwas (OpenEJB) verwendet eine andere Version von JPA als das, was Sie erwarten. Sehen Sie sich die entsprechenden Versionen von OpenEJB an, Ihren JPA-Provider, das JPA-API-Jar usw. –
@NeilStockton Ich benutze ** openejb-3.1.4 ** und ** EclipseLink 2.6 **, das ** javax zu verwenden scheint. Persistenz_2.1.1 ** gemäß dem JAR-Dateinamen. Ich dachte TypedQuery ist in JPA 2.x verwendbar. – Nier
eclipselink verwendet JPA 2.1, ja. Hat OpenEJB? Da es OpenEJB ist, beklagt sich die Ausnahme über die Implementierung einer JPA 2-Methode, und mein starker Vorschlag, der auf dieser Fehlermeldung basiert, ist NEIN, es ist nicht gegen JPA 1! –