ここまでで、次のコードを介して Shipvia エンティティ クラスを利用する 1 つの画面を備えた完全に機能する NetBeans プラットフォーム アプリケーションが完成しました。
import entity.Shipvia;
import entity.Route;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Persistence;
import javax.persistence.Query;
public class RetrieveResultList {
public static List RetrieveResultList (String tablename){
EntityManager entityManager = Persistence.createEntityManagerFactory("EntityLibraryPU").createEntityManager();
System.out.println("NAMED QUERY:>"+tablename+".findAll");
Query query = entityManager.createNamedQuery(tablename+".findAll");
List<Shipvia> resultList = query.getResultList();
return resultList;
}
}
ご覧のとおり、渡されたテーブル名に基づいて動的クエリを作成します。したがって、ユーザーが ShipviaTopComponent を開くと、Shipvia.findAll が呼び出されます (以下のエンティティ クラスの一部を参照)。
package entity;
import java.io.Serializable;
import javax.persistence.*;
import javax.xml.bind.annotation.XmlRootElement;
@Entity
@Table(name = "SHIPVIA")
@XmlRootElement
@NamedQueries({
@NamedQuery(name = "Shipvia.findAll", query = "SELECT c FROM Shipvia c")
});
私の目標は、RouteTopComponent という 2 番目の画面で Route エンティティ クラスを利用することです。
package entity;
import java.io.Serializable;
import javax.persistence.*;
import javax.xml.bind.annotation.XmlRootElement;
@Entity
@Table(name = "ROUTE")
@XmlRootElement
@NamedQueries({
@NamedQuery(name = "Route.findAll", query = "SELECT c FROM Route c")
});
ただし、ルート画面を開こうとすると、次のエラーが表示されます。
SEVERE [global]
java.lang.IllegalArgumentException: NamedQuery of name: Route.findAll not found.
at org.eclipse.persistence.internal.jpa.EJBQueryImpl.getDatabaseQueryInternal(EJBQueryImpl.java:577)
at org.eclipse.persistence.internal.jpa.EntityManagerImpl.createNamedQuery(EntityManagerImpl.java:1043)
at com.demo.viewer.RetrieveResultList.RetrieveResultList(RetrieveResultList.java:23)
at com.demo.viewer.RoutesTopComponent.<clinit>(RoutesTopComponent.java:40)
Caused: java.lang.ExceptionInInitializerError
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
RouteTopComponent の 40 行目は次のとおりです。
List<Route> resultList = RetrieveResultList.RetrieveResultList("Route");
ShipviaTopComponentを開いてShipvia.findAllを見つけてもRouteTopComponent/Route.findAllを見つけられないのはなぜですか?