2016-03-28 5 views
0

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?

+0

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. –

+0

@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

+0

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! –

Antwort

0

Diese Ausnahme tritt häufig auf, wenn wir eine alte Version einer interface-Implementierung verwenden, in der eine neue interface-Methode fehlt. Sie können die ältere Versionsmethode überprüfen, die Sie in Ihrem Code verwenden, und diese Methode mit der neuesten Version ändern.

kann es aufgrund von einigen version Kompatibilität sein.

Verwandte Themen