Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA查询createQuery问题_Java_Servlets_Jpa - Fatal编程技术网

Java JPA查询createQuery问题

Java JPA查询createQuery问题,java,servlets,jpa,Java,Servlets,Jpa,我正在学习JPA,并且一直在遵循一个教程 该教程项目是一个简单的航班预订动态网站,带有JPA和derby数据库 我有一个带有@Entity注释的乘客类和一个作为无状态本地bean的乘客服务类。乘客服务类有一个getPassentials方法,该方法从乘客p、乘客类中创建QuerySelectp;返回的结果是乘客列表 要调用此方法,我有一个GetPassenger servlet,将查询结果列表设置为http请求属性,并将其发送到jsp视图文件 问题是,当我使用getPassenger方法运行se

我正在学习JPA,并且一直在遵循一个教程

该教程项目是一个简单的航班预订动态网站,带有JPA和derby数据库

我有一个带有@Entity注释的乘客类和一个作为无状态本地bean的乘客服务类。乘客服务类有一个getPassentials方法,该方法从乘客p、乘客类中创建QuerySelectp;返回的结果是乘客列表

要调用此方法,我有一个GetPassenger servlet,将查询结果列表设置为http请求属性,并将其发送到jsp视图文件

问题是,当我使用getPassenger方法运行servlet时,返回的列表是空的,即使我确保数据库的passenger表中有几个条目。下面是我的代码。谢谢你的帮助

谢谢

乘客等级:

package com.airline.models;

import java.io.Serializable;
import java.util.Date;

import javax.persistence.*;

/**
* Entity implementation class for Entity: Passenger
*
*/
@Entity

public class Passenger implements Serializable {
@Override
public String toString() {
    return "Passenger [id=" + id + ", firstName=" + firstName + ", lastName=" + lastName + ", dob=" + dob
            + ", gender=" + gender + ", flightclass=" + flightclass + "]";
}

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;

private String firstName;

private String lastName;

@Temporal(TemporalType.DATE)
private Date dob;

@Enumerated(EnumType.STRING)
private Gender gender;

@Enumerated(EnumType.STRING)
private FlightClass flightclass;
乘客服务等级:

package com.airline.service;

import java.util.List;

import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;

import com.airline.models.Flight;
import com.airline.models.Passenger;

/**
*  Session Bean implementation class PassengerService
*/
@Stateless
@LocalBean
public class PassengerService {

/**
 * Default constructor.
 */
public PassengerService() {
    // TODO Auto-generated constructor stub
}

@PersistenceContext(unitName = "airline")
EntityManager em;

public void addPassenger(Passenger p) {
    em.persist(p);
}

public List<Passenger> getPassengers() {
    try{

    TypedQuery<Passenger> query = em.createQuery("SELECT p FROM PASSENGER p",    Passenger.class);

    List<Passenger> pList = (List<Passenger>)query.getResultList();

    return pList;
    }
    catch (Exception e)
    {
        System.out.println("Passenger not found");
        return null;
    }
}
}
GetPassenger servlet:

package com.airline.controllers;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

import javax.ejb.EJB;
import javax.print.attribute.standard.PrinterState;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.airline.models.Flight;
import com.airline.models.Passenger;
import com.airline.service.FlightService;
import com.airline.service.PassengerService;

/**
* Servlet implementation class GetFlight
*/
@WebServlet("/GetPassenger")
public class GetPassenger extends HttpServlet {
private static final long serialVersionUID = 1L;


@EJB
PassengerService ps;
/**
 * @see HttpServlet#HttpServlet()
 */
public GetPassenger() {
    super();
    // TODO Auto-generated constructor stub
}

/**
 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
 */
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    List<Passenger> pList = (List<Passenger>)ps.getPassengers();

    request.setAttribute("Passenger_List", pList);

    if(pList == null)
    {
        System.out.println("passenger list empty");
        return;
    }

    RequestDispatcher view = request.getRequestDispatcher("WEB-INF/views/passenger_list.jsp");

    view.forward(request, response);


}

/**
 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
 */
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
    doGet(request, response);
}

通过将实际查询从Selectp from PASSENGER p更改为Selectp from PASSENGER p来解决此问题


乘客指的是实体类的名称,而不是表的名称。

当我说列表为空时,我的意思是在控制台上,公共列表GetPassents下的try-catch块打印出Passenger not found,servlet的if-pList==null打印出Passenger list empty。此外,这些类是航班的相同副本,我之前制作的FlightService和GetFlight做了完全相同的事情,并从同一数据库不同的表中打印出航班列表。唯一的区别是我使用的FlightService:TypedQuery fQuery=em.createNamedQueryFlight.FindById,Flight.class;和@NamedQueryname=Flight.FindById,query=从Flight f中选择f,其中f.id=:id,结果正如预期的那样,打印出了一个航班列表。当您在catch块中结束并将乘客列表打印为空时,出现了什么异常?这可能是您的线索,因为即使没有结果,您也不应该得到异常。调试到该块以查看异常是什么,或者执行e.PrintStackTraceCauseBy:exception[EclipseLink-0]Eclipse持久性服务-2.6.0.payara-p1:org.Eclipse.Persistence.exceptions.JPQLException异常描述:编译问题[SELECT p FROM p]。[14,23]抽象架构类型“乘客”未知-这很奇怪。名为PASSENGER的数据库下没有架构,所有内容都在架构airline下…?是的,JPA查询针对的是实体类型和实体上的属性,而不是直接针对它们映射到的表和列。Assenger指的是实体类的名称,而不是表的名称对JPQL不是SQL。经过一些挖掘,我意识到了这一点。谢谢你们两位的时间。